package com.mastercard.assets.util.dao;

import java.math.BigDecimal;
import java.sql.Date;

import java.sql.Timestamp;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.apache.struts.upload.FormFile;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.flows.FlowUtil;
import com.mastercard.assets.jpa.TblAgencia;
import com.mastercard.assets.jpa.TblAlerta;
import com.mastercard.assets.jpa.TblAlertaUsuario;
import com.mastercard.assets.jpa.TblAutorizacionesRoles;
import com.mastercard.assets.jpa.TblAnio;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblAssetPaisRegional;
import com.mastercard.assets.jpa.TblFlujoAutorizacion;
import com.mastercard.assets.jpa.TblPaises;
import com.mastercard.assets.jpa.TblAssetSolRespuesta;
import com.mastercard.assets.jpa.TblAssetSolicitud;
import com.mastercard.assets.jpa.TblAssetTipo;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblCampaniaMes;
import com.mastercard.assets.jpa.TblCampaniaProductoAdq;
import com.mastercard.assets.jpa.TblCampaniaProductoUsuario;
import com.mastercard.assets.jpa.TblCategoria;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblDomestic;
import com.mastercard.assets.jpa.TblEjecucionMaterial;
import com.mastercard.assets.jpa.TblEjecucionMaterialArchivo;
import com.mastercard.assets.jpa.TblFileRespaldo;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblForma;
import com.mastercard.assets.jpa.TblFormaAlarma;
import com.mastercard.assets.jpa.TblFormaAlerta;
import com.mastercard.assets.jpa.TblFormaRespaldo;
import com.mastercard.assets.jpa.TblFormaSalida;
import com.mastercard.assets.jpa.TblGanador;
import com.mastercard.assets.jpa.TblMaterialAsset;
import com.mastercard.assets.jpa.TblNivel;
import com.mastercard.assets.jpa.TblNotificacion;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblPaqueteRegional;
import com.mastercard.assets.jpa.TblPing;
import com.mastercard.assets.jpa.TblPreimplementacion;
import com.mastercard.assets.jpa.TblPreimplementacionCotiza;
import com.mastercard.assets.jpa.TblPreimplementacionCotizacionServicio;
import com.mastercard.assets.jpa.TblPreimplementacionCotizacionServicioPK;
import com.mastercard.assets.jpa.TblPreimplementacionFlujoautRoles;
import com.mastercard.assets.jpa.TblProducto;
import com.mastercard.assets.jpa.TblRole;
import com.mastercard.assets.jpa.TblSegmento;
import com.mastercard.assets.jpa.TblServicio;
import com.mastercard.assets.jpa.TblSubcateg;
import com.mastercard.assets.jpa.TblTarea;
import com.mastercard.assets.jpa.TblTareaEjecucion;
import com.mastercard.assets.jpa.TblTareaFlujo;
import com.mastercard.assets.jpa.TblTareaFlujoPK;
import com.mastercard.assets.jpa.TblTareaPreimplementacion;
import com.mastercard.assets.jpa.TblTipoCampania;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblTipoCuentaPaquete;
import com.mastercard.assets.jpa.TblTipoCuentaReal;
import com.mastercard.assets.jpa.TblTipoProducto;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.notifications.NotificationUtil;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.web.struts.forms.FlowProcessForm;
import com.mastercard.assets.web.util.reportes.datosReporteCuatro;
import com.mastercard.assets.web.util.reportes.datosReporteTres;
import com.mastercard.assets.web.util.to.CampaniaProductoAdqWraper;
import com.mastercard.assets.web.util.to.CampaniaProductoWraper;
import com.mastercard.assets.web.util.to.MismaTarea;
import com.mastercard.assets.web.util.to.MultipleDataTO;
import com.mastercard.assets.web.util.to.UserLogin;
import com.mastercard.assets.web.util.to.utilReporteDos;
import com.mastercard.assets.web.util.to.utilReporteUno;
import java.text.SimpleDateFormat;

public class MasterCardDAO
{
	private static EntityManager em ;
        private static EntityManagerFactory emf ;
        private static int contador = 0 ;

	public static void init( )
		throws
			MasterCardException
	{
		// en caso e que no sea null
		if( em == null )
		{
                        emf = Persistence.createEntityManagerFactory( "MasterCardJPA" ) ;
			em = emf.createEntityManager( ) ;
                        System.out.println( "(°_°)===== ABRIENDO CONEXION " ) ;			
			//MCUtil.intiPasswordSecurity( ) ;
		}
                
//                contador += 1 ;
//                System.out.println( "(*_*)+----Contador----+ " + contador ) ;
	}
	
	public static TblUsuario checkUser( String user , String pass )
		throws
			MasterCardException
	{
            init( ) ;
		// // ping( 1 ) ;
//		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			
//                        et.begin( ) ;
                        Query q = em.createNamedQuery( "User.FindByLogin" ) ;
			q.setParameter( "userLogin" , user ) ;
			q.setParameter( "userPass" , pass ) ;
			List< TblUsuario > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l.size( ) == 0 ){
//                            et.commit( ) ;
                            return null ;
                        }				
			
			TblUsuario usuario = l.get( 0 ) ;
			
			em.refresh( usuario ) ;
//			et.commit( ) ;
			// en caso de que si haya resultados
			return usuario ;
		}catch( Exception e )
		{
//                    et.rollback();
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.login.ErrorTryingCheckUser" , user ) , 
					MCUtil.MASTERCARD_ERROR_CODE_SECURITY_PASSWORD_CIPHER_INITIALIZATION , 
					e ) ;
		}
	}
        
        public static TblGanador checkGanador( String user , String pass )
		throws
			MasterCardException
	{
            init( ) ;
		// // ping( 1 ) ;
		
		try
		{
//                        EntityTransaction et = em.getTransaction( ) ;
//                        et.begin( ) ;
			Query q = em.createNamedQuery( "Winner.FindByLogin" ) ;
			q.setParameter( "userLogin" , user ) ;
			q.setParameter( "userPass" , pass ) ;
			List< TblGanador > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l.size( ) == 0 )
				return null ;
			
			TblGanador ganador = l.get( 0 ) ;
			
			em.refresh( ganador ) ;
//			et.commit();
			// en caso de que si haya resultados
			return ganador ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.login.ErrorTryingCheckUser" , user ) , 
					MCUtil.MASTERCARD_ERROR_CODE_SECURITY_PASSWORD_CIPHER_INITIALIZATION , 
					e ) ;
		}
	}
	
	public static void closeEntityManager( )
	{
		if( em != null )
		{
			em.close( ) ;
			em = null ;
                        System.out.println( "(*_*)===== CERRANDO CONEXION_em " ) ;			
		}
                
                if( emf != null ) {
                    emf.close( ) ;
                    emf = null ;
                    System.out.println( "(*_*)===== CERRANDO CONEXION_emf " ) ;			
                }
	}
	
	/*
         Catalogo Paises
         */
        public static TblPaises  getPaisesByCve( int cvePais ){
        try {
            init( ) ;
//                EntityTransaction et = em.getTransaction( ) ;
//                        et.begin( ) ;
                TblPaises tc = em.find( TblPaises.class , new Integer( cvePais ) ) ;
//                et.commit();
                return tc ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return null ;
        }
	}
        
        public static List< TblPaises>  getPaises( ){
        try {
            init ( ) ;
//            EntityTransaction et = em.getTransaction( ) ;
//                        et.begin( ) ;
                Query q = em.createNamedQuery( "Paises.FindAllTblPaisesActivos" ) ;
                List< TblPaises > res = q.getResultList();
//                et.commit();
                
                if( res.size( ) > 0 )
                        // si existe
                        return res ;
                
                // no existe
                return null ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return null ;
        }
	}
        
        public static List< TblAssetPaisRegional >  getLista( int cveAssetRegional ){
        try {
            init( ) ;
//            EntityTransaction et = em.getTransaction( ) ;
//                        et.begin( ) ;
                Query q = em.createNamedQuery( "AssetRegional.FindAllAssetRegionalbyId" ) ;
                q.setParameter( "cve" , cveAssetRegional ) ;
                List< TblAssetPaisRegional > res = q.getResultList();
//                et.commit();
                
                if( res.size( ) > 0 )
                        // si existe
                        return res ;		
                
                // no existe
                return res = new ArrayList< TblAssetPaisRegional >( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return null ;
        }
	}
        
        public static List< TblAssetPaisRegional >  getListaEspecifica( int cveAssetRegional , int cveAssetPais ){
        try {
            init(  ) ;
                Query q = em.createNamedQuery( "AssetRegional.FindAllAssetRegionalbyAmbos" ) ;
                q.setParameter( "cveAR" , cveAssetRegional ) ;
                q.setParameter( "cveAP" , cveAssetPais ) ;
                List< TblAssetPaisRegional > res = q.getResultList();
                
                if( res.size( ) > 0 )
                        // si existe
                        return res ;
                                
                // no existe
                return res = new ArrayList< TblAssetPaisRegional >( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return null ;
        }
	}
        
        public static TblAssetPaisRegional getRelacionAssetsRegionPais( int cveAP )
        {
        try {
            init( ) ;
//            EntityTransaction et = em.getTransaction( ) ;
//            et.begin( ) ;
            TblAssetPaisRegional res = new TblAssetPaisRegional( ) ;
            Query q = em.createNamedQuery( "AssetRegional.FindAllAssetRegionalbyAsstPais" ) ;
            q.setParameter( "cveAP" , cveAP ) ;
            List< TblAssetPaisRegional > l = q.getResultList( ) ;
//            et.commit();
         
            if( l == null || l.isEmpty( ) )
                return res ;
            
            for( TblAssetPaisRegional tapr : l )
            {
                res = tapr ;
            }
                        
            return res ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return null ;
        }
         
        }
                
        public static List< TblPaises>  getPaisesExceptoUno( ){
        try {
            init( ) ;
            List< TblPaises > lPaises = new ArrayList< TblPaises >( ) ;
//            EntityTransaction et = em.getTransaction( ) ;
//                        et.begin( ) ;
                Query q = em.createNamedQuery( "Paises.FindAllTblPaisesActivosException" ) ;
                List< TblPaises > res = q.getResultList();
//                et.commit();
                
                for( TblPaises pais : res ) {
                    if( pais.getCvePais( ) != 17 ) {
                        lPaises.add( pais ) ;
                    }
                }
                
                if( lPaises.size( ) > 0 )
                        // si existe
                        return lPaises ;
                
                // no existe
                return null ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return null ;
        }
	}
        
        public static boolean updatePais( String cvePais, String nombre, String clave ){
        try {
            init( ) ;
            EntityTransaction et = em.getTransaction( ) ;
            et.begin( ) ;
            TblPaises tc = em.find( TblPaises.class , new Integer( cvePais ) ) ;
            tc.setNombre( nombre ) ;
            tc.setCodigo( clave ) ;			
            em.merge( tc ) ;
            em.flush( ) ;
            et.commit( ) ;
            return true;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return false ;
        }
        }
        
        public static boolean deletePais( String cvePais ){
        try {
            init(  ) ;
            EntityTransaction et = em.getTransaction( ) ;
            et.begin( ) ;
            TblPaises tc = em.find( TblPaises.class , new Integer( cvePais ) ) ;
            tc.setStatus( 0 ) ;				
            em.merge( tc ) ;
            em.flush( ) ;
            et.commit( ) ;
            return true;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return false ;
        }
        }
        
        public static boolean addNewPais( String nombre, String clave ){
        try {
            init( ) ;
            EntityTransaction et = em.getTransaction( ) ;
            et.begin( ) ;
            TblPaises tc = new TblPaises();
            tc.setNombre( nombre ) ;
            tc.setCodigo( clave ) ;				
            tc.setStatus( 1 ) ;				
            em.persist( tc ) ;
            em.flush( ) ;
            et.commit( ) ;
            return true;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            return false ;
        }
        }

	////////////// Categorias
	
	public static boolean existActiveCategoryByName( String name )
	{
        try {
            init( ) ;
                // // ping( 2 ) ;
                
                // verifica que nombre no este vacio
                if( name == null || name.trim( ).length( ) == 0 )
                        // regresa que no existe
                        return false ;
                
                // verifica si ya existe
//                EntityTransaction et = em.getTransaction( ) ;
//                et.begin( ) ;
                Query q = em.createNamedQuery( "Category.FindActiveCategoryByName" ) ;
                q.setParameter( "nombre" , name ) ;
                List< TblCategoria > res = q.getResultList( ) ;
//                et.commit();
                
                // en caso de haber resultados
                if( res.size( ) > 0 )
                        // si existe
                        return true ;
                
                // no existe
                return false ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return false ;
        }
	}
	
	public static boolean existActiveCategoryByNameWithoutId( String name , int cve )
	{
        try {
            init( ) ;
                // // ping( 3 ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return false ;
        }
		
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// verifica si ya existe
//                EntityTransaction et = em.getTransaction( ) ;
//                et.begin( ) ;
		Query q = em.createNamedQuery( "Category.FindActiveCategoryByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblCategoria > res = q.getResultList( ) ;
//		et.commit();
                
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblCategoria u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveCategoria( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveCategoryByName( String name )
	{
        try {
            init( ) ;
                // // ping( 4 ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return false ;
        }
		
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Category.FindInactiveCategoryByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblCategoria > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseCategory( int cve )
		throws
			MasterCardException
	{
            init( ) ;
		// // ping( 5 ) ;
		
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.categoria.nuevo.dao.CanNotEraseCategory" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CATEGORY_CAN_NOT_ERASE , 
					null ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblCategoria tc = em.find( TblCategoria.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.categoria.nuevo.dao.ErrorOnRemoveCategory" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CATEGORY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateCategory( int cve , String name , String desc )
		throws
			MasterCardException
	{
            init() ;
		// // ping( 6 ) ;
		
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.categoria.nuevo.dao.CanNotUpdateCategory" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CATEGORY_CAN_NOT_UPDATE , 
					null ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblCategoria tc = em.find( TblCategoria.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.categoria.nuevo.dao.ErrorOnUpdateCategory" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CATEGORY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblCategoria findCategoryById( int cve )
	{
        try {
            init() ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return null ;
        }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		// // ping( 7 ) ;
		
		// obtiene el registro
//                EntityTransaction et = em.getTransaction( ) ;
//                et.begin( ) ;
		TblCategoria tc = em.find( TblCategoria.class , new Integer( cve ) ) ;
//		et.commit();
                closeEntityManager( ) ;
		return tc ;
	}
	
	public static List< TblCategoria > getAllActiveCategorias( )
		throws
			MasterCardException
	{
            init() ;
		// // ping( 8 ) ;
//		EntityTransaction et = em.getTransaction( ) ;
                
		try
		{
//                    et.begin( ) ;
			Query q = em.createNamedQuery( "Category.FindAllActiveCategory" ) ;
			List< TblCategoria > l = q.getResultList( ) ;
//                        et.commit();
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblCategoria >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
//                    et.rollback();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.counttypes.ErrorTryingGetAllActiveCountTypes" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNT_TYPES , 
					e ) ;
		}
	}
	
	
	
	

	////////////// Segmentos
	
	public static boolean addNewSegment( String name , String desc )
		throws
			MasterCardException
	{
            init() ;
		// // ping( 9 ) ;
		
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.segmento.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SEGMENT_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// en caso de haber resultados
		if( existActiveSegmentByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.segmento.nuevo.dao.SegmentAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SEGMENT_ALREADY_EXIST , 
					null ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveSegmentByName( name ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "Segment.FindAllInactiveSegmentByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblSegmento > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblSegmento tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
				
			}catch( Exception e )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.segmento.nuevo.dao.ErrorAddingSegment" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SEGMENT_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblSegmento tc = new TblSegmento( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setStatus( ( byte ) 1 ) ;
//		tc.setComdev( ( byte ) 1 ) ;
//		tc.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.segmento.nuevo.dao.ErrorAddingSegment" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SEGMENT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveSegmentByName( String name )
	{
        try {
            init( ) ;
                // // ping( 10 ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return false ;
        }
		
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// verifica si ya existe
//                EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		Query q = em.createNamedQuery( "Segment.FindActiveSegmentByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblSegmento > res = q.getResultList( ) ;
//                et.commit();
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveSegmentByNameWithoutId( String name , int cve )
	{
        try {
            init( ) ;
                // // ping( 11 ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return false ;
        }
		
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// verifica si ya existe
//                EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		Query q = em.createNamedQuery( "Segment.FindActiveSegmentByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblSegmento > res = q.getResultList( ) ;
//		et.commit();
                
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblSegmento u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveSegmento( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveSegmentByName( String name )
	{
        try {
            init() ;
                // // ping( 12 ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// verifica si ya existe                
		Query q = em.createNamedQuery( "Segment.FindInactiveSegmentByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblSegmento > res = q.getResultList( ) ;		
                
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseSegment( int cve )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.segmento.nuevo.dao.CanNotEraseSegment" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SEGMENT_CAN_NOT_ERASE , 
					null ) ;
		
		// // ping( 13 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblSegmento tc = em.find( TblSegmento.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.segmento.nuevo.dao.ErrorOnRemoveSegment" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SEGMENT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateSegment( int cve , String name , String desc )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.segmento.nuevo.dao.CanNotUpdateSegment" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SEGMENT_CAN_NOT_UPDATE , 
					null ) ;
		
		// // ping( 14 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblSegmento tc = em.find( TblSegmento.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.segmento.nuevo.dao.ErrorOnUpdateSegment" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SEGMENT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblSegmento findSegmentById( int cve )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		// // ping( 15 ) ;
		
		// obtiene el registro
//                EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		TblSegmento tc = em.find( TblSegmento.class , new Integer( cve ) ) ;
//                et.commit();                
		closeEntityManager( ) ;
		return tc ;
	}
	
	public static List< TblSegmento > getAllActiveSegments( )
		throws
			MasterCardException
	{
            init() ;
		// // ping( 16 ) ;
		
		try
		{
//                        EntityTransaction et = em.getTransaction( ) ;
//                        et.begin( ) ;
			Query q = em.createNamedQuery( "Segment.FindAllActiveSegments" ) ;
			List< TblSegmento > l = q.getResultList( ) ;
//                        et.commit();
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblSegmento >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.segments.ErrorTryingGetAllActiveSegments" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_SEGMENTS , 
					e ) ;
		}
	}
	
	
	
	
	
	

	////////////// Tipos de Productos
	
	public static boolean existActiveProductTypeByName( String name )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// // ping( 17 ) ;
		
		// verifica si ya existe
//                EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		Query q = em.createNamedQuery( "ProductType.FindActiveProductTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoProducto > res = q.getResultList( ) ;
//		et.commit();
                
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveProductTypeByNameWithoutId( String name , int cve )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// // ping( 18 ) ;
		
		// verifica si ya existe
//                EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		Query q = em.createNamedQuery( "ProductType.FindActiveProductTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoProducto > res = q.getResultList( ) ;
//                et.commit();
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblTipoProducto u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveTipoProducto( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveProductTypeByName( String name )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "ProductType.FindInactiveProductTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoProducto > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseProductType( int cve )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipoproducto.nuevo.dao.CanNotEraseProductType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCTTYPE_CAN_NOT_ERASE , 
					null ) ;
		
		// // ping( 19 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblTipoProducto tc = em.find( TblTipoProducto.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipoproducto.nuevo.dao.ErrorOnRemoveProductType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateProductType( int cve , String name )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipoproducto.nuevo.dao.CanNotUpdateProductType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCTTYPE_CAN_NOT_UPDATE , 
					null ) ;
		
		// // ping( 20 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblTipoProducto tc = em.find( TblTipoProducto.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipoproducto.nuevo.dao.ErrorOnUpdateProductType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblTipoProducto findProductTypeById( int cve )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		// // ping( 21 ) ;
		
		// obtiene el registro
//                EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		TblTipoProducto tc = em.find( TblTipoProducto.class , new Integer( cve ) ) ;
//                et.commit();
		
		return tc ;
	}
	
	public static List< TblTipoProducto > getAllActiveProductTypes( )
		throws
			MasterCardException
	{
            init( ) ;
		try
		{
			// // ping( 22 ) ;
			
			Query q = em.createNamedQuery( "ProductType.FindAllActiveProductTypes" ) ;
			List< TblTipoProducto > l = q.getResultList( ) ;
                        
			// en caso de null
			if( l == null )
				return new ArrayList< TblTipoProducto >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.producttypes.ErrorTryingGetAllActiveProductTypes" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_PRODUCTTYPE , 
					e ) ;
		}
	}
        
        public static List< TblTipoProducto > getActiveProductTypesById( int cve )
		throws
			MasterCardException
        {
            init( ) ;
            try
            {
                Query q = em.createNamedQuery( "ProductType.FindActiveProductTypeById" ) ;
                q.setParameter( "clave" , cve ) ;
                List < TblTipoProducto > l = q.getResultList( ) ;
                
                if ( l == null )
                    return new ArrayList< TblTipoProducto >( );
                
                return l ;
            }catch( Exception e )
		{
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.producttypes.ErrorTryingGetAllActiveProductTypes" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_PRODUCTTYPE , 
					e ) ;
		}
        }
                
	public static List< TblCuenta > getActiveCountById ( int cve )
        {
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
            
            try
            {
                Query q = em.createNamedQuery( "Count.FindActiveCountById" ) ;
                q.setParameter( "cve" , cve ) ;
                List< TblCuenta > l = q.getResultList( ) ;
                
                if ( l == null )
                    return new ArrayList< TblCuenta > ( ) ;
                
                return l ;
            }catch( Exception e )
            {
                e.printStackTrace();
                return new ArrayList< TblCuenta > ( ) ;
            }
        }
        
	public static boolean addNewProductType( String name )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipoproducto.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCTTYPE_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de haber resultados
		if( existActiveProductTypeByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipoproducto.nuevo.dao.ProductTypeAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCTTYPE_ALREADY_EXIST , 
					null ) ;
		
		// // ping( 23 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveProductTypeByName( name ) )
		{
			// lo activa
			try
			{
				// busca
				Query q = em.createNamedQuery( "ProductType.FindAllInactiveProductTypeByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblTipoProducto > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblTipoProducto tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
			}catch( Exception e )
			{
				et.rollback( ) ;
				e.printStackTrace();
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipoproducto.nuevo.dao.ErrorAddingProductType" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCTTYPE_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblTipoProducto tc = new TblTipoProducto( ) ;
		tc.setNombre( name ) ;
		tc.setStatus( ( byte ) 1 ) ;
//		tc.setComdev( ( byte ) 1 ) ;
//		tc.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipoproducto.nuevo.dao.ErrorAddingProductType" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	
	//////////////// CountType 
	
	public static boolean addNewCategory( String name , String desc )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.categoria.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CATEGORY_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// en caso de haber resultados
		if( existActiveCategoryByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.categoria.nuevo.dao.CategoryAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CATEGORY_ALREADY_EXIST , 
					null ) ;
		
		// ping( 24 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveCategoryByName( name ) )
		{
			// lo activa
			try
			{
				// busca
				Query q = em.createNamedQuery( "Category.FindAllInactiveCategoryByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblCategoria > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblCategoria tc = tcs.get( 0 ) ;
						
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
				
					return true ;
				}
			}catch( Exception e )
			{
				et.rollback( ) ;
				e.printStackTrace();
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.categoria.nuevo.dao.ErrorAddingCategory" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CATEGORY_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblCategoria tc = new TblCategoria( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setStatus( ( byte ) 1 ) ;
//		tc.setComdev( ( byte ) 1 ) ;
//		tc.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorAddingCountType" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static List< TblTipoCuenta > getAllActiveCountTypes( )
		throws
			MasterCardException
	{
            init( ) ;   
		try
		{
			Query q = em.createNamedQuery( "CountTypes.FindAllActiveCountTypes" ) ;
			List< TblTipoCuenta > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null ){
                            return new ArrayList< TblTipoCuenta >( ) ;
                        }
				
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.counttypes.ErrorTryingGetAllActiveCountTypes" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNT_TYPES , 
					e ) ;
		}
	}
        
        public static List< TblTipoCuenta > getAllActiveCountTypesByCountry( int cvePais )
		throws
			MasterCardException
	{
            init( ) ;
		try
		{
			Query q = em.createNamedQuery( "CountTypes.FindAllActiveCountTypesByCountry" ) ;
                        q.setParameter("pais", cvePais) ;
			List< TblTipoCuenta > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null ){
                            return new ArrayList< TblTipoCuenta >( ) ;
                        }
			// en caso de que si haya resultados
                        closeEntityManager( ) ;
                        
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.counttypes.ErrorTryingGetAllActiveCountTypes" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNT_TYPES , 
					e ) ;
		}
	}
	
	public static List< TblTipoCuentaReal > getAllActiveRealCountTypes( )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }            
		try
		{
			Query q = em.createNamedQuery( "RealCountTypes.FindAllActiveRealCountTypes" ) ;
			List< TblTipoCuentaReal > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null ){
                            return new ArrayList< TblTipoCuentaReal >( ) ;
                        }				
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			return new ArrayList< TblTipoCuentaReal >( ) ;
		}
	}
	
	
	//////////////// CountType
	
	public static boolean addNewCountType( String name , String desc , int cvePais )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// en caso de haber resultados
		if( existActiveCountTypeByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.CountTypeAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_ALREADY_EXIST , 
					null ) ;
		
		// ping( 27 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
                TblPaises pais = new TblPaises( ) ;
                pais.setCvePais( cvePais );
		// en caso de que exista desactivado
		if( existInactiveCountTypeByName( name ) )
		{
			// lo activa
			try
			{
				// busca
				Query q = em.createNamedQuery( "CountTypes.FindAllInactiveCountTypesByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblTipoCuenta > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblTipoCuenta tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
                                        tc.setTblPais( pais ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
			}catch( Exception e )
			{
				et.rollback( ) ;
				e.printStackTrace();
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorAddingCountType" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblTipoCuenta tc = new TblTipoCuenta( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setStatus( ( byte ) 1 ) ;
                tc.setTblPais( pais );
//		tc.setComdev( ( byte ) 1 ) ;
//		tc.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorAddingCountType" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	
	//////////////// RealCountType
	
	public static boolean addNewRealCountType( String name , String desc )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// en caso de haber resultados
		if( existActiveRealCountTypeByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.RealCountTypeAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_REALCOUNTTYPE_ALREADY_EXIST , 
					null ) ;
		
		// ping( 28 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveRealCountTypeByName( name ) )
		{
			// lo activa
			try
			{
				// busca
				Query q = em.createNamedQuery( "RealCountTypes.FindAllInactiveRealCountTypesByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblTipoCuentaReal > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblTipoCuentaReal tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
			}catch( Exception e )
			{
				et.rollback( ) ;
				e.printStackTrace();
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorAddingRealCountType" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_REALCOUNTTYPE_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblTipoCuentaReal tc = new TblTipoCuentaReal( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setStatus( ( byte ) 1 ) ;
//		tc.setComdev( ( byte ) 1 ) ;
//		tc.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorAddingRealCountType" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_REALCOUNTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	
	////////////// Count
	
	public static List< TblCuenta > getAllActiveCounts( )
		throws
			MasterCardException
	{
            init( ) ;
		try
		{
			Query q = em.createNamedQuery( "Count.FindAllActiveCounts" ) ;
			List< TblCuenta > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblCuenta >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.counttypes.ErrorTryingGetAllActiveCounts" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNTS , 
					e ) ;
		}
	}
        
        public static List< TblCuenta > getAllActiveCountsByCountry( int cvePais )
		throws
			MasterCardException
	{
            init( ) ;
		try
		{	
			Query q = em.createNamedQuery( "Count.FindAllActiveCountByCountry" ) ;
                        q.setParameter( "pais" , cvePais ) ;
			List< TblCuenta > l = q.getResultList( ) ;
                        
			// en caso de null
			if( l == null )
				return new ArrayList< TblCuenta >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.counttypes.ErrorTryingGetAllActiveCounts" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNTS , 
					e ) ;
		}
	}
	
	public static boolean addNewCount( String name , String desc , int cveCountType , int cveRealCountType )
		throws
			MasterCardException
	{
            init( ) ;
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// verifica el countType
		TblTipoCuenta countType = findCountTypeById( cveCountType ) ;
		
		// en caso de que sea null
		if( countType == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.CountTypeNotExist" , cveCountType ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_COUNTTYPE_NOT_EXIST , 
					null ) ;
		
		// verifica el realcountType
		TblTipoCuentaReal realCountType = findRealCountTypeById( cveRealCountType ) ;
		
		// en caso de que sea null
		if( realCountType == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.RealCountTypeNotExist" , cveRealCountType ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_REALCOUNTTYPE_NOT_EXIST , 
					null ) ;

		// en caso de haber resultados
		if( existActiveCountByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.CountTypeAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_ALREADY_EXIST , 
					null ) ;
		
		// ping( 30 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveCountByName( name ) )
		{
			// lo activa
			try
			{
				// busca
				Query q = em.createNamedQuery( "Count.FindAllInactiveCountByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblCuenta > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblCuenta tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;

					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					// verifica el tipo de cuenta
					TblTipoCuenta tipoCuenta = tc.getTblTipoCuenta( ) ;
					
					// en cao de que sea dif
					if( tipoCuenta.getCveTipoCuenta( ) != countType.getCveTipoCuenta( ) )
					{
						// modifica
						tipoCuenta.getTblCuentas( ).remove( tc ) ;
						
						em.merge( tipoCuenta ) ;
						em.flush( ) ;
//						em.refresh( tipoCuenta ) ;
						
						tc.setTblTipoCuenta( countType ) ;
						
						em.merge( tc ) ;
						em.flush( ) ;
//						em.refresh( tc ) ;
					}
					
					// verifica el tipo de cuenta
					TblTipoCuentaReal tipoCuentaReal = tc.getTblTipoCuentaReal( ) ;
					
					// en cao de que sea dif
					if( tipoCuentaReal.getCveTipoCuentaReal( ) != realCountType.getCveTipoCuentaReal( ) )
					{
						// modifica
						tipoCuentaReal.getTblCuentas( ).remove( tc ) ;
						
						em.merge( tipoCuentaReal ) ;
						em.flush( ) ;
//						em.refresh( tipoCuentaReal ) ;
						
						tc.setTblTipoCuentaReal( realCountType ) ;
						
						em.merge( tc ) ;
						em.flush( ) ;
//						em.refresh( tc ) ;
					}
					
					et.commit( ) ;
					
					return true ;
				}
			}catch( Exception e )
			{
				et.rollback( ) ;
				e.printStackTrace();
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.ErrorAddingCount" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblCuenta tc = new TblCuenta( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setTblTipoCuenta( countType ) ;
		tc.setStatus( ( byte ) 1 ) ;
		tc.setTblTipoCuenta( countType ) ;
		tc.setTblTipoCuentaReal( realCountType ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.ErrorAddingCount" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveCountByName( String name )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
				
		// verifica si ya existe
		Query q = em.createNamedQuery( "Count.FindActiveCountByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCuenta > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveCountById( int cveCuenta )
	{
        try {
            init( ) ;
                // ping( 32 ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		
		TblCuenta cuenta = findCountById( cveCuenta ) ;
		
		// en caso de no null
		if( cuenta != null )
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveCountByNameWithoutId( String name , int cve )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Count.FindActiveCountByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblCuenta > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblCuenta u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveCuenta( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveCountWithCountType( int cveCountType )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Count.FindAllActiveCountsWithCountType" ) ;
		q.setParameter( "countType" , cveCountType ) ;
		List< TblCuenta > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveCountWithRealCountType( int cveRealCountType )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica si ya existe
		Query q = em.createNamedQuery( "Count.FindAllActiveCountsWithRealCountType" ) ;
		q.setParameter( "countType" , cveRealCountType ) ;
		List< TblCuenta > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	protected static boolean existCountWithCountType( int cveCountType )
	{
        try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica si ya existe
		Query q = em.createNamedQuery( "Count.FindAllCountsWithCountType" ) ;
		q.setParameter( "countType" , cveCountType ) ;
		List< TblTipoCuenta > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveCountByName( String name )
	{
            try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 37 ) ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Count.FindInactiveCountByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCuenta > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseCount( int cve )
		throws
			MasterCardException
	{
            try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.CanNotEraseAcount" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 38 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblCuenta tc = em.find( TblCuenta.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			// obtiene el tipo de cuenta
			TblTipoCuenta tipoCuenta = tc.getTblTipoCuenta( ) ;
			
			// lo borra del tipo de cuenta
			tipoCuenta.getTblCuentas( ).remove( tc ) ;
			
			em.merge( tc ) ;
			
			//TODO Falta logica de negocios para regresar los paquetes asignados a la cuenta borrada.
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.ErrorOnRemoveAcount" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateCount( int cve , String name , String desc , int cveCountType , int cveRealCountType )
		throws
			MasterCardException
	{
            try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.CanNotUpdateAcount" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 39 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// toma el tipo de cuenta
			TblTipoCuenta tcR = em.find( TblTipoCuenta.class , new Integer( cveCountType ) ) ;
			
			// en caos de null
			if( tcR == null )
			{
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.CountTypeNotExist" , cveCountType ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_COUNTTYPE_NOT_EXIST , 
						null ) ;
			}
			
			// toma el tipo de cuenta
			TblTipoCuentaReal tcReal = em.find( TblTipoCuentaReal.class , new Integer( cveRealCountType ) ) ;
			
			// en caos de null
			if( tcReal == null )
			{
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.RealCountTypeNotExist" , cveCountType ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_REALCOUNTTYPE_NOT_EXIST , 
						null ) ;
			}
			
			// obtiene el registro
			TblCuenta tc = em.find( TblCuenta.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			et.begin( ) ;
			
			em.merge( tc ) ;
			em.flush( ) ;
//			em.refresh( tc ) ;
			
			// verifica el tipo de cuenta
			TblTipoCuenta tipoCuentaActual = tc.getTblTipoCuenta( ) ;
			
			// en caso de que sea dif
			if( tipoCuentaActual.getCveTipoCuenta( ) != tcR.getCveTipoCuenta( ) )
			{
				// quita de actual
				tipoCuentaActual.getTblCuentas( ).remove( tipoCuentaActual ) ;
				
				em.merge( tipoCuentaActual ) ;
				em.flush( ) ;
//				em.refresh( tipoCuentaActual ) ;
				
				// agrega el nuevo
				tc.setTblTipoCuenta( tcR ) ;
				
				em.merge( tcR ) ;
				em.flush( ) ;
//				em.refresh( tcR ) ;
				
				// agrga al tipoCuentaNuevo
				tcR.getTblCuentas( ).add( tc ) ;
				
				em.merge( tcR ) ;
				em.flush( ) ;
//				em.refresh( tcR ) ;
				
			}
			
			// verifica el tipo de cuenta
			TblTipoCuentaReal tipoCuentaRealActual = tc.getTblTipoCuentaReal( ) ;
			
			// en caso de que sea dif
			if( tipoCuentaRealActual.getCveTipoCuentaReal( ) != tcReal.getCveTipoCuentaReal( ) )
			{
				// quita de actual
				tipoCuentaRealActual.getTblCuentas( ).remove( tipoCuentaRealActual ) ;
				
				em.merge( tipoCuentaRealActual ) ;
				em.flush( ) ;
//				em.refresh( tipoCuentaRealActual ) ;
				
				// agrega el nuevo
				tc.setTblTipoCuentaReal( tcReal ) ;
				
				em.merge( tcReal ) ;
				em.flush( ) ;
//				em.refresh( tcReal ) ;
				
				// agrga al tipoCuentaNuevo
				tcReal.getTblCuentas( ).add( tc ) ;
				
				em.merge( tcReal ) ;
				em.flush( ) ;
//				em.refresh( tcReal ) ;
				
			}
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.nuevo.dao.ErrorOnUpdateAcount" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblCuenta findCountById( int cve )
	{
            try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		// obtiene el registro
		TblCuenta tc = em.find( TblCuenta.class , new Integer( cve ) ) ;
                
		return tc ;
	}

	

	////////////// Count
	
	public static List< TblSubcateg > getAllActiveSubcategory( )
		throws
			MasterCardException
	{
            try {
            init( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
		try
		{
			Query q = em.createNamedQuery( "Subcategory.FindAllActiveSubcategory" ) ;
			List< TblSubcateg > l = q.getResultList( ) ;
			// en caso de null
			if( l == null )
				return new ArrayList< TblSubcateg >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.subcategory.ErrorTryingGetAllActiveSubcategory" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNTS , 
					e ) ;
		}
	}
        
        public static List< TblCuenta > getAllActiveCountsWithCountType( int cveCuenta )
                throws
                        MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try
            {
                Query q = em.createNamedQuery( "Count.FindAllActiveCountsWithCountType" ) ;
		q.setParameter( "countType" , cveCuenta ) ;
		List< TblCuenta > res = q.getResultList( ) ;
                //en caso de null
                if ( res == null )
                    return new ArrayList< TblCuenta >( ) ;
                
                // en caso de resultdos
                return res ;
            }catch( Exception e )
            {
                e.printStackTrace();
                throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.counttypes.ErrorTryingGetAllActiveCounts" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNTS , 
					e ) ;
            }
        }
        
        public static TblTipoCuenta findTypeCountById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;		
		
                
		// obtiene el registro
		TblTipoCuenta tc = em.find( TblTipoCuenta.class , new Integer( cve ) ) ;
		
		return tc ;
	}
	
	public static List< TblSubcateg > getAllActiveSubcategoryFromCategory( int cveCategory )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		if( cveCategory < 1 )
			return new ArrayList< TblSubcateg >( ) ;
                
		try
		{
			Query q = em.createNamedQuery( "Subcategory.FindAllActiveSubcategoryWithCategory" ) ;
			q.setParameter( "categoria" , cveCategory ) ;
			List< TblSubcateg > l = q.getResultList( ) ;
		
			// en caso de null
			if( l == null )
				return new ArrayList< TblSubcateg >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.subcategory.ErrorTryingGetAllActiveSubcategory" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNTS , 
					e ) ;
		}
	}
	
	public static boolean addNewSubcategory( String name , String desc , int cveCategory )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// verifica el countType
		TblCategoria countType = findCategoryById( cveCategory ) ;
		
		// en caso de que sea null
		if( countType == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.CategoryNotExist" , cveCategory ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_CATEGORY_NOT_EXIST , 
					null ) ;

		// en caso de haber resultados
		if( existActiveSubcategoryByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.categoria.nuevo.dao.SubcategoryAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_ALREADY_EXIST , 
					null ) ;
		
		// ping( 43 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveSubcategoryByName( name ) )
		{
			// lo activa
			try
			{
				// busca
				Query q = em.createNamedQuery( "Subcategory.FindAllInactiveSubcategoryByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblSubcateg > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblSubcateg tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					tc.setTblCategoria( countType ) ;
					
					// agrega al countType
					countType.getTblSubcategs( ).add( tc ) ;
					
					em.merge( tc ) ;
					em.merge( countType ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
			}catch( Exception e )
			{
				et.rollback( ) ;
				e.printStackTrace();
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.ErrorAddingSubcategory" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblSubcateg tc = new TblSubcateg( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setTblCategoria( countType ) ;
		tc.setStatus( ( byte ) 1 ) ;
		
		// coloca la subcatego en la catego
		countType.getTblSubcategs( ).add( tc ) ;
		
		try
		{
			em.persist( tc ) ;
			em.merge( countType ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.ErrorAddingSubcategory" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveSubcategoryByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Subcategory.FindActiveSubcategoryByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblSubcateg > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveSubcategoryByNameWithoutId( String name , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Subcategory.FindActiveSubcategoryByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblSubcateg > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblSubcateg u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveSubcateg( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveSubcategoryWithCountType( int cveCategory )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Subcategory.FindAllActiveSubcategoryWithCategory" ) ;
		q.setParameter( "categoria" , cveCategory ) ;
		List< TblSubcateg > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	protected static boolean existSubcategoryWithCountType( int cveCategory )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Subcategory.FindAllSubcategoryWithCategory" ) ;
		q.setParameter( "categoria" , cveCategory ) ;
		List< TblSubcateg > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveProductWithProductType( int cveTipoProducto )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Product.FindAllActiveProductWithProductType" ) ;
		q.setParameter( "tipoProducto" , cveTipoProducto ) ;
		List< TblProducto > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
        
        public static List<TblProducto> getAllActiveProductWithProductType( int cveTipoProducto )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Product.FindAllActiveProductWithProductType" ) ;
		q.setParameter( "tipoProducto" , cveTipoProducto ) ;
		List< TblProducto > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 ){
                    for(TblProducto p : res ){
                        if( p.getStatus( ) == 0 ){
                            res.remove( p ) ;
                        }
                    }
                    
                }
			
			return res ;
	}
	
	protected static boolean existProductWithProductType( int cveTipoProducto )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Product.FindAllProductWithProductType" ) ;
		q.setParameter( "tipoProducto" , cveTipoProducto ) ;
		List< TblProducto > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
        
        
        public static List< TblProducto > getAllActiveProductsWithProductType2 ( )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                
            try
            {
            
                Query q = em.createNamedQuery( "Product.FindAllActiveProductWithProductType2" ) ;
                List< TblProducto > res = q.getResultList( ) ;
            
                if ( res == null )
                        return new ArrayList< TblProducto >( ) ;

                return res ;
            }catch( Exception e )
                {
                    return new ArrayList< TblProducto >( ) ;
                }
        }
        
        public static List< TblProducto > getAllActiveProductsWithProductType5 ( )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                
            try
            {
                Query q = em.createNamedQuery( "Product.FindAllActiveProductWithProductType5" ) ;
                List< TblProducto > res = q.getResultList( ) ;
             

                if ( res == null )
                        return new ArrayList< TblProducto >( ) ;

                return res ;
            }catch( Exception e )
                {
                    e.printStackTrace();
                    return new ArrayList< TblProducto >( ) ;
                }
        }
        
        public static List< TblProducto > getAllActiveProductsWithProductType3 ( )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                
            try
            {
                Query q = em.createNamedQuery( "Product.FindAllActiveProductWithProductType3" ) ;
                List< TblProducto > res = q.getResultList( ) ;

                if ( res == null )
                        return new ArrayList< TblProducto >( ) ;

                return res ;
            }catch( Exception e )
                {
                    e.printStackTrace();
                    return new ArrayList< TblProducto >( ) ;
                }
        }
	
	public static boolean existActiveProductWithSegment( int cveSegment )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Product.FindAllActiveProductWithSegment" ) ;
		q.setParameter( "segmento" , cveSegment ) ;
		List< TblProducto > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	protected static boolean existProductWithSegment( int cveSegment )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica si ya existe
		Query q = em.createNamedQuery( "Product.FindAllProductWithSegment" ) ;
		q.setParameter( "segmento" , cveSegment ) ;
		List< TblProducto > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveSubcategoryByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 52 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "Subcategory.FindInactiveSubcategoryByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblSubcateg > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseSubcategory( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.CanNotEraseSubcategory" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 53 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblSubcateg tc = em.find( TblSubcateg.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			// obtiene la categoria
			TblCategoria categ = tc.getTblCategoria( ) ;
			
			// lo borra de la categoria
			categ.getTblSubcategs( ).remove( tc ) ;
			
			// borra de la subcategoria
			tc.setTblCategoria( null ) ;
			
			em.merge( tc ) ;
			em.merge( categ ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.ErrorOnRemoveSubcategory" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNT_ERROR , 
					e ) ;
		}
		
		return true ;
	}

	public static boolean updateSubcategory( int cve , String name , String desc , int cveCategory )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.CanNotUpdateSubcategory" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 54 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// toma el tipo de cuenta
			TblCategoria tcR = em.find( TblCategoria.class , new Integer( cveCategory ) ) ;
			
			// en caos de null
			if( tcR == null )
			{
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.CategoryNotExist" , cveCategory ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_CATEGORY_NOT_EXIST , 
						null ) ;
			}
			
			// obtiene el registro
			TblSubcateg tc = em.find( TblSubcateg.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			tc.setTblCategoria( tcR ) ;
			
			et.begin( ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.subcategoria.nuevo.dao.ErrorOnUpdateSubcategory" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SUBCATEGORY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblSubcateg findSubcategoryById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		// ping( 55 ) ;
		// obtiene el registro
		TblSubcateg tc = em.find( TblSubcateg.class , new Integer( cve ) ) ;
		return tc ;
	}

	
	
	
	
	
	//////////////////////// TIPOS DE CUENTA
	
	
	public static boolean existActiveCountTypeByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "CountTypes.FindActiveCountTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCuenta > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveCountTypeByNameWithoutId( String name , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "CountTypes.FindActiveCountTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCuenta > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblTipoCuenta u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveTipoCuenta( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveCountTypeByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 58 ) ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "CountTypes.FindInactiveCountTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCuenta > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseCountType( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.CanNotEraseAcountType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 59 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblTipoCuenta tc = em.find( TblTipoCuenta.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorOnRemoveAcountType" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateCountType( int cve , String name , String desc )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.CanNotUpdateAcountType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 60 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblTipoCuenta tc = em.find( TblTipoCuenta.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorOnUpdateAcountType" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblTipoCuenta findCountTypeById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		
		// obtiene el registro
		TblTipoCuenta tc = em.find( TblTipoCuenta.class , new Integer( cve ) ) ;
		
		return tc ;
	}


	
	
	
	
	
	//////////////////////// TIPOS DE CUENTA REAL
	
	
	public static boolean existActiveRealCountTypeByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "RealCountTypes.FindActiveRealCountTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCuentaReal > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveRealCountTypeByNameWithoutId( String name , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "RealCountTypes.FindActiveRealCountTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCuentaReal > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblTipoCuentaReal u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveTipoCuentaReal( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveRealCountTypeByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 64 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "RealCountTypes.FindInactiveRealCountTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCuentaReal > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseRealCountType( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.CanNotEraseARealCountType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_REALCOUNTTYPE_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 65 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblTipoCuentaReal tc = em.find( TblTipoCuentaReal.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorOnRemoveARealCountType" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_REALCOUNTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateRealCountType( int cve , String name , String desc )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.CanNotUpdateARealCountType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 66 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblTipoCuentaReal tc = em.find( TblTipoCuentaReal.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorOnUpdateARealCountType" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblTipoCuentaReal findRealCountTypeById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		
		// obtiene el registro
		TblTipoCuentaReal tc = em.find( TblTipoCuentaReal.class , new Integer( cve ) ) ;
		
		return tc ;
	}

	

	////////////// Productos
	
	public static List< TblProducto > getAllActiveProduct( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			
			Query q = em.createNamedQuery( "Product.FindAllActiveProduct" ) ;
			List< TblProducto > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblProducto >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblProducto >( ) ;
		}
	}
        
        public static List< TblProducto > getActiveProductById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
                
		try
		{
						
			Query q = em.createNamedQuery( "Product.FindActiveProductById" ) ;
                        q.setParameter( "clave" , cve ) ;
			List< TblProducto > l = q.getResultList( ) ;
		
			// en caso de null
			if( l == null )
				return new ArrayList< TblProducto >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			return new ArrayList< TblProducto >( ) ;
		}
	} 
	
	public static boolean addNewProduct( String name , String desc , int cveSegmento , int cveTipoProducto )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// en caso de haber resultados
                // a peticion del cliente se pueden crear productos con el mismo
//		if( existActiveProductByName( name ) )
//			// lanza excepcion
//			throw new MasterCardException( 
//					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.ProductAlreadyExist" , name ) , 
//					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_ALREADY_EXIST , 
//					null ) ;
		
		// verifica el Segmento
		TblSegmento segmento = findSegmentById( cveSegmento ) ;
		
		// en caso de que sea null
		if( segmento == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.SegmentNotExist" , cveSegmento ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_SEGMENT_NOT_EXIST , 
					null ) ;
		
		// verifica el Tipo de producto
		TblTipoProducto tipoProducto = findProductTypeById( cveTipoProducto ) ;
		
		// en caso de que sea null
		if( tipoProducto == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.ProductTypeNotExist" , cveSegmento ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_PRODUCTTYPE_NOT_EXIST , 
					null ) ;
		
		// ping( 69 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveProductByName( name ) )
		{
			// lo activa
			try
			{
				// busca
				Query q = em.createNamedQuery( "Product.FindAllInactiveProductByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblProducto > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblProducto tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					tc.setTblSegmento( segmento ) ;
					tc.setTblTipoProducto( tipoProducto ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
			}catch( Exception e )
			{
				et.rollback( ) ;
				e.printStackTrace();
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.ErrorAddingProduct" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblProducto tc = new TblProducto( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setTblSegmento( segmento ) ;
		tc.setTblTipoProducto( tipoProducto ) ;
		tc.setStatus( ( byte ) 1 ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.ErrorAddingProduct" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveProductByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Product.FindActiveProductByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblProducto > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveProductByNameWithoutId( String name , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Product.FindActiveProductByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblProducto > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblProducto u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveProducto( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveProductByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 72 ) ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Product.FindInactiveProductByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblProducto > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseProduct( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.product.nuevo.dao.CanNotEraseProduct" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 73 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblProducto tc = em.find( TblProducto.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.ErrorOnRemoveProduct" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateProduct( int cve , String name , String desc , int cveSegmento , int cveTipoProducto )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.CanNotUpdateProduct" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 74 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// toma el tipo de producto
			TblTipoProducto tcR = em.find( TblTipoProducto.class , new Integer( cveTipoProducto ) ) ;
			
			// en caos de null
			if( tcR == null )
			{
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.product.nuevo.dao.ProductTypeNotExist" , cveTipoProducto ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_PRODUCTTYPE_NOT_EXIST , 
						null ) ;
			}
			
			// toma el segmento
			TblSegmento tcS = em.find( TblSegmento.class , new Integer( cveSegmento ) ) ;
			
			// en caos de null
			if( tcS == null )
			{
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.product.nuevo.dao.SegmentNotExist" , cveSegmento ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_SEGMENT_NOT_EXIST , 
						null ) ;
			}

			// obtiene el registro
			TblProducto tc = em.find( TblProducto.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			tc.setTblTipoProducto( tcR ) ;
			tc.setTblSegmento( tcS ) ;
			
			et.begin( ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.producto.nuevo.dao.ErrorOnUpdateProduct" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PRODUCT_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblProducto findProductById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		// ping( 75 ) ;
		// obtiene el registro
		TblProducto tc = em.find( TblProducto.class , new Integer( cve ) ) ;
		return tc ;
	}
	////////////////////////
	
	////////////// Categorias
	
	public static boolean existActiveCampaignTypeByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "CampaignType.FindActiveCampaignTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCampania > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
        
        // busca tipo de campaña por id
        public static List< TblTipoCampania > ActiveCampaingTypeById( int clave )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
           
            Query q = em.createNamedQuery( "CampaignType.FindActiveCampaignTypeById" ) ;
            q.setParameter( "cve" , clave ) ;
            List< TblTipoCampania > res = q.getResultList( ) ;
           
            
            return res ;
        }
	
	public static boolean existActiveCampaignTypeByNameWithoutId( String name , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "CampaignType.FindActiveCampaignTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCampania > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblTipoCampania u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveTipoCampania( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveCampaignTypeByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 78 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "CampaignType.FindInactiveCampaignTypeByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblTipoCampania > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseCampaignType( int cve )
		throws
			MasterCardException
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocampana.nuevo.dao.CanNotEraseCampaignType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CAMPAIGN_TYPE_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 79 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblTipoCampania tc = em.find( TblTipoCampania.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocampana.nuevo.dao.ErrorOnRemoveCampaignType" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CAMPAIGN_TYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateCampaignType( int cve , String name , String desc )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocampana.nuevo.dao.CanNotUpdateCampaignType" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CAMPAIGN_TYPE_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 80 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblTipoCampania tc = em.find( TblTipoCampania.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocampana.nuevo.dao.ErrorOnUpdateCampaignType" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CAMPAIGN_TYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblTipoCampania findCampaignTypeById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		
		// obtiene el registro
		TblTipoCampania tc = em.find( TblTipoCampania.class , new Integer( cve ) ) ;
		
		return tc ;
	}
	
	public static List< TblTipoCampania > getAllActiveCampaignTypes( )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                
		try
		{
		
			Query q = em.createNamedQuery( "CampaignType.FindAllActiveCampaignTypes" ) ;
			List< TblTipoCampania > l = q.getResultList( ) ;
                        
			// en caso de null
			if( l == null )
				return new ArrayList< TblTipoCampania >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.campaigntypes.ErrorTryingGetAllActiveCampaignTypes" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_COUNT_TYPES , 
					e ) ;
		}
	}
	
	public static boolean addNewCampaignType( String name , String desc )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocampana.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CAMPAIGN_TYPE_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// en caso de haber resultados
		if( existActiveCampaignTypeByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocampana.nuevo.dao.SegmentAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CAMPAIGN_TYPE_ALREADY_EXIST , 
					null ) ;
		
		// ping( 83 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveCampaignTypeByName( name ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "CampaignType.FindAllInactiveCampaignTypeByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblTipoCampania > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblTipoCampania tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
				
			}catch( Exception e )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocampana.nuevo.dao.ErrorAddingSegment" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CAMPAIGN_TYPE_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblTipoCampania tc = new TblTipoCampania( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setStatus( ( byte ) 1 ) ;
//		tc.setComdev( ( byte ) 1 ) ;
//		tc.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocampana.nuevo.dao.ErrorAddingSegment" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_CAMPAIGN_TYPE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	
	
	

	////////////// Servicios
	
	public static boolean addNewService( String name , String desc )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.servicio.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SERVICE_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// en caso de haber resultados
		if( existActiveServiceByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.servicio.nuevo.dao.ServiceAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SERVICE_ALREADY_EXIST , 
					null ) ;
		
		// ping( 84 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveServiceByName( name ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "Service.FindAllInactiveServiceByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblServicio > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblServicio tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
				
			}catch( Exception e )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.servicio.nuevo.dao.ErrorAddingService" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SERVICE_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblServicio tc = new TblServicio( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setStatus( ( byte ) 1 ) ;
//		tc.setComdev( ( byte ) 1 ) ;
//		tc.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.servicio.nuevo.dao.ErrorAddingService" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SERVICE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveServiceByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
				
		// verifica si ya existe
		Query q = em.createNamedQuery( "Service.FindActiveServiceByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblServicio > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveServiceByNameWithoutId( String name , int cve )
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
				
		// verifica si ya existe
		Query q = em.createNamedQuery( "Service.FindActiveServiceByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblServicio > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblServicio u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveServicio( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveServiceByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 87 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "Service.FindInactiveServiceByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblServicio > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseService( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.servicio.nuevo.dao.CanNotEraseService" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SERVICE_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 88 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblServicio tc = em.find( TblServicio.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.servicio.nuevo.dao.ErrorOnRemoveService" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SERVICE_ERROR , 
					e ) ;
		}
		
		return true ;
	}

	public static boolean updateService( int cve , String name , String desc )
		throws
			MasterCardException
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.servicio.nuevo.dao.CanNotUpdateService" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SERVICE_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 89 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblServicio tc = em.find( TblServicio.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.servicio.nuevo.dao.ErrorOnUpdateService" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_SERVICE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblServicio findServiceById( int cve )
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		
		// obtiene el registro
		TblServicio tc = em.find( TblServicio.class , new Integer( cve ) ) ;
		
		return tc ;
	}
	
	public static List< TblServicio > getAllActiveServices( )
		throws
			MasterCardException
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			
			Query q = em.createNamedQuery( "Service.FindAllActiveServices" ) ;
			List< TblServicio > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblServicio >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.services.ErrorTryingGetAllActiveServices" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_SEGMENTS , 
					e ) ;
		}
	}
	
	
	

	////////////// Agencias
	
	public static boolean addNewAgency( String name , String desc , String contacto , String direccion , String telefono, String extension )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( desc == null )
			desc = "" ;
		
		// en caso de haber resultados
		if( existActiveAgencyByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.AgencyAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_ALREADY_EXIST , 
					null ) ;
		
		// ping( 92 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveAgencyByName( name ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "Agency.FindAllInactiveAgencyByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblAgencia > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblAgencia tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					tc.setContacto( contacto ) ;
					tc.setDireccion( direccion ) ;
					tc.setTelefono( telefono ) ;
                                        tc.setExtension( extension ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
				
			}catch( Exception e )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.ErrorAddingAgency" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblAgencia tc = new TblAgencia( ) ;
		tc.setNombre( name ) ;
		tc.setDescripcion( desc ) ;
		tc.setContacto( contacto ) ;
		tc.setDireccion( direccion ) ;
		tc.setTelefono( telefono ) ;
                tc.setExtension( extension ) ;
		tc.setStatus( ( byte ) 1 ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.ErrorAddingAgency" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveAgencyByName( String name )
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Agency.FindActiveAgencyByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblAgencia > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
        
	public static boolean existActiveAgencyByNameWithoutId( String name , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Agency.FindActiveAgencyByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblAgencia > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblAgencia u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveAgencia( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveAgencyByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 95 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "Agency.FindInactiveAgencyByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblAgencia > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseAgency( int cve )
		throws
			MasterCardException
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.CanNotEraseAgency" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 96 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblAgencia tc = em.find( TblAgencia.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.ErrorOnRemoveAgency" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateAgency( int cve , String name , String desc , String contacto , String direccion , String telefono, String extension )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.CanNotUpdateAgency" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 97 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblAgencia tc = em.find( TblAgencia.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			tc.setContacto( contacto ) ;
			tc.setDireccion( direccion ) ;
			tc.setTelefono( telefono ) ;
                        tc.setExtension( extension ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.ErrorOnUpdateAgency" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblAgencia findAgencyById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		
		// obtiene el registro
		TblAgencia tc = em.find( TblAgencia.class , new Integer( cve ) ) ;
		
		return tc ;
	}
	
        public static TblFlujoAutorizacion findFlujoAutorizacion( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;		
		
		// obtiene el registro
		TblFlujoAutorizacion tc = em.find( TblFlujoAutorizacion.class , new Integer( cve ) ) ;
		
		return tc ;
	}
	
	public static List< TblAgencia > getAllActiveAgencies( )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                
		try
		{
			Query q = em.createNamedQuery( "Agency.FindAllActiveAgencies" ) ;
			List< TblAgencia > l = q.getResultList( ) ;
		
			// en caso de null
			if( l == null )
				return new ArrayList< TblAgencia >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.agency.ErrorTryingGetAllActiveAgencies" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_AGENCIES , 
					e ) ;
		}
	}
	
	
	
	
	

	////////////// Notificaciones
	
	public static boolean addNewNotification( int tipoNotificacion , int cveAlerta , int cveRole , int cveNivel , int tipo , String mail )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica archivos
		if( tipoNotificacion < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayTipoNotificaciones" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		if( cveAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayAlerta" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		// ping( 100 ) ;
		
		TblAlerta alerta = em.find( TblAlerta.class , new Integer( cveAlerta ) ) ;
		
		// en caso de que no exista
		if( alerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoExisteAlerta" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_ALERT_NOT_EXIST , 
					null ) ;
		
		if( cveRole < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayRol" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		TblRole role = em.find( TblRole.class , new Integer( cveRole ) ) ;
		
		// en caso de que no exista
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoExisteRol" , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_ROLE_NOT_EXIST , 
					null ) ;
		
		if( cveNivel < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayNivel" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		TblNivel nivel = em.find( TblNivel.class , new Integer( cveNivel ) ) ;
		
		// en caso de que no exista
		if( nivel == null && cveNivel > 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoExisteNivel" , cveNivel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_LEVEL_NOT_EXIST , 
					null ) ;
		
		if( tipo < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayTipo" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		if( mail == null )
			mail = "" ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// crea el registro
			TblNotificacion noti = new TblNotificacion( ) ;
			
			noti.setEmail( mail ) ;
			noti.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			noti.setStatus( ( byte ) 1 ) ;
			noti.setTblAlerta( alerta ) ;
			noti.setTblNivel( nivel ) ;
			noti.setTblRole( role ) ;
			noti.setTipo( tipo ) ;
			noti.setTipoNotificacion( tipoNotificacion ) ;
			
			em.persist( noti ) ;
			em.flush( ) ;
			em.refresh( noti ) ;
			
			// actualiza los registros relacionados
			alerta.getTblNotificacions( ).add( noti ) ;
			em.merge( alerta ) ;
			em.flush( ) ;
//			em.refresh( alerta ) ;
			
			if( nivel != null )
			{
				nivel.getTblNotificacions( ).add( noti ) ;
				em.merge( nivel ) ;
				em.flush( ) ;
//				em.refresh( nivel ) ;
			}
			
			role.getTblNotificacions( ).add( noti ) ;
			em.merge( role ) ;
			em.flush( ) ;
//			em.refresh( role ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.ErrorRegistering" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_ERROR , 
					e ) ;
		}
		
		return true ;
	}	
	
	public static boolean eraseNotification( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.CanNotEraseNotificacion" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 101 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblNotificacion tc = em.find( TblNotificacion.class , new Integer( cve ) ) ;
			
			em.refresh( tc ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			em.flush( ) ;
//			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.ErrorOnRemoveAgency" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateNotification( int cveNotification , int tipoNotificacion , int cveAlerta , int cveRole , int cveNivel , int tipo , String mail )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveNotification < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.CveNotificacionWrong" , cveNotification ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_CAN_NOT_UPDATE , 
					null ) ;
		
		// verifica archivos
		if( tipoNotificacion < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayTipoNotificaciones" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		if( cveAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayAlerta" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		// ping( 102 ) ;
		
		TblAlerta alerta = em.find( TblAlerta.class , new Integer( cveAlerta ) ) ;
		
		// en caso de que no exista
		if( alerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoExisteAlerta" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_ALERT_NOT_EXIST , 
					null ) ;
		
		if( cveRole < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayRol" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		TblRole role = em.find( TblRole.class , new Integer( cveRole ) ) ;
		
		// en caso de que no exista
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoExisteRol" , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_ROLE_NOT_EXIST , 
					null ) ;
		
		if( cveNivel < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayNivel" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		TblNivel nivel = em.find( TblNivel.class , new Integer( cveNivel ) ) ;
		
		// en caso de que no exista
		if( nivel == null && cveNivel > 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoExisteNivel" , cveNivel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_LEVEL_NOT_EXIST , 
					null ) ;
		
		if( tipo < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.NoHayTipo" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_EMPTY_FIELD_NAME , 
					null ) ;
		
		if( mail == null )
			mail = "" ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblNotificacion tc = em.find( TblNotificacion.class , new Integer( cveNotification ) ) ;
			
			// actualiza valores
			tc.setEmail( mail ) ;
			tc.setTipo( tipo ) ;
			tc.setTipoNotificacion( tipoNotificacion ) ;
			
			em.merge( tc ) ;
			em.flush( ) ;
//			em.refresh( tc ) ;
			
			// modifica objetos
			// toma la alerat
			TblAlerta al = tc.getTblAlerta( ) ;
			// en caso de no null
			if( al != null )
			{
				al.getTblNotificacions( ).remove( tc ) ;
				
				em.merge( al ) ;
				em.flush( ) ;
//				em.refresh( al ) ;
				
				tc.setTblAlerta( alerta ) ;
				em.merge( tc ) ;
				em.flush( ) ;
//				em.refresh( tc ) ;
				
				alerta.getTblNotificacions( ).add( tc ) ;
				em.merge( alerta ) ;
				em.flush( ) ;
//				em.refresh( alerta ) ;
			}
			
			// toma la alerat
			TblRole ro = tc.getTblRole( ) ;
			// en caso de no null
			if( ro != null )
			{
				ro.getTblNotificacions( ).remove( tc ) ;
				
				em.merge( ro ) ;
				em.flush( ) ;
//				em.refresh( ro ) ;
				
				tc.setTblRole( role ) ;
				em.merge( tc ) ;
				em.flush( ) ;
//				em.refresh( tc ) ;
				
				role.getTblNotificacions( ).add( tc ) ;
				em.merge( role ) ;
				em.flush( ) ;
//				em.refresh( role ) ;
			}
			
			TblNivel ni = tc.getTblNivel( ) ;
			// en caso de no null
			if( ni != null )
			{
				ni.getTblNotificacions( ).remove( tc ) ;
				
				em.merge( ni ) ;
				em.flush( ) ;
//				em.refresh( ni ) ;
				
				tc.setTblNivel( nivel ) ;
				em.merge( tc ) ;
				em.flush( ) ;
//				em.refresh( tc ) ;
				
				if( nivel != null )
				{
					role.getTblNotificacions( ).add( tc ) ;
					em.merge( role ) ;
					em.flush( ) ;
//					em.refresh( role ) ;
				}
			}
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.catalogos.notificaciones.errors.ErrorUpdating" , cveNotification ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_NOTIFICATION_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblNotificacion findNotificacionById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		
		// obtiene el registro
		TblNotificacion tc = em.find( TblNotificacion.class , new Integer( cve ) ) ;
		
		em.refresh( tc ) ;
                
		return tc ;
	}
	
	public static List< TblNotificacion > getAllActiveNotifications( )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                            
		try
		{
			Query q = em.createNamedQuery( "Notification.FindAllActiveNotifications" ) ;
			List< TblNotificacion > l = q.getResultList( ) ;
		
			// en caso de null
			if( l == null )
				return new ArrayList< TblNotificacion >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.notification.ErrorTryingGetAllActiveNotifications" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_NOTIFICATIONS , 
					e ) ;
		}
	}
	
	public static List< TblNotificacion > getAllActiveNotificationsByTipoNotificacion( int tipoNotificacion )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                            
		try
		{
//			// ping( 105 ) ;
                        
			Query q = em.createNamedQuery( "Notification.FindAllActiveNotificationsByTipoNotificacion" ) ;
			q.setParameter( "tipoNotificacion" , tipoNotificacion ) ;
			List< TblNotificacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null ){
                            
                            return new ArrayList< TblNotificacion >( ) ;
                        }
				
			
			for( TblNotificacion l1 : l )
				em.refresh( l1 ) ;
                        
                        
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.notification.ErrorTryingGetAllActiveNotifications" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_NOTIFICATIONS , 
					e ) ;
		}
	}
	
	public static List< TblNotificacion > getAllActiveNotificationsByTipoNotificacionAndTipo( int tipoNotificacion , int tipo )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			Query q = em.createNamedQuery( "Notification.FindAllActiveNotificationsByTipoNotificacion" ) ;
			q.setParameter( "tipoNotificacion" , new Integer( tipoNotificacion ) ) ;
			q.setParameter( "tipo" , new Integer( tipo ) ) ;
			List< TblNotificacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null ){                 
                            return new ArrayList< TblNotificacion >( ) ;
                        }
				
			
			for( TblNotificacion l1 : l )
				em.refresh( l1 ) ;
                                                
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.notification.ErrorTryingGetAllActiveNotifications" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_NOTIFICATIONS , 
					e ) ;
		}
	}
	
	
	
	

	////////////// Roles
	
	public static boolean existActiveLevelWithRole( int cveRole )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Level.FindAllActiveLevelsWithRole" ) ;
		q.setParameter( "role" , cveRole ) ;
		List< TblNivel > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean addNewRole( String name )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.rol.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ROLE_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de haber resultados
		if( existActiveRoleByName( name ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.rol.nuevo.dao.RoleAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ROLE_ALREADY_EXIST , 
					null ) ;
		
		// ping( 108 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveRoleByName( name ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "Role.FindAllInactiveRoleByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblRole > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblRole tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
				
			}catch( Exception e )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.rol.nuevo.dao.ErrorAddingRole" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ROLE_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblRole tc = new TblRole( ) ;
		tc.setNombre( name ) ;
		tc.setStatus( ( byte ) 1 ) ;
//		tc.setComdev( ( byte ) 1 ) ;
//		tc.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.rol.nuevo.dao.ErrorAddingRole" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ROLE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveRoleByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Role.FindActiveRoleByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblRole > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveRoleByNameWithoutId( String name , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Role.FindActiveRoleByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblRole > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblRole u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveRole( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveRoleByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 111 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "Role.FindInactiveRoleByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblRole > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseRole( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.rol.nuevo.dao.CanNotEraseRole" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ROLE_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 112 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblRole tc = em.find( TblRole.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.rol.nuevo.dao.ErrorOnRemoveRole" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ROLE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateRole( int cve , String name )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.rol.nuevo.dao.CanNotUpdateRole" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ROLE_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 113 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblRole tc = em.find( TblRole.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.rol.nuevo.dao.ErrorOnUpdateRole" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ROLE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblRole findRoleById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		// ping( 114 ) ;		
		// obtiene el registro
		TblRole tc = em.find( TblRole.class , new Integer( cve ) ) ;
		return tc ;
	}
	
	public static List< TblRole > getAllActiveRoles( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			Query q = em.createNamedQuery( "Role.FindAllActiveRoles" ) ;
			List< TblRole > l = q.getResultList( ) ;
		
			// en caso de null
			if( l == null )
				return new ArrayList< TblRole >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblRole >( ) ;
		}
	}
	
	
	

	////////////// Niveles
	
	public static boolean addNewLevel( String name , String desc , int cveRole )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de haber resultados
		if( existActiveLevelByNameAndRole( name , cveRole ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.LevelAlreadyExist" , name ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_ALREADY_EXIST , 
					null ) ;
		
		if( desc == null )
			desc = "" ;
		
		// verifica el countType
		TblRole role = findRoleById( cveRole ) ;
		
		// en caso de que sea null
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.RoleNotExist" , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_ROLE_NOT_EXIST , 
					null ) ;
		
		
		// ping( 116 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveLevelByName( name ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "Level.FindAllInactiveLevelByName" ) ;
				q.setParameter( "nombre" , name ) ;
				List< TblNivel > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblNivel tc = tcs.get( 0 ) ;
					
					// role anterior
					TblRole roleOld = tc.getTblRole( ) ;
					
					boolean sameRole = false ;
					
					// en caso de que sea no null e igual al cveRol
					if( roleOld != null && roleOld.getCveRole( ) == cveRole )
						// se trata del mismo role
						sameRole = true ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( desc ) ;
					// en caso de que no tenga el mismo role
					if( ! sameRole )
						tc.setTblRole( role ) ;
					
					em.merge( tc ) ;
					
					// en caso de que no sea el mismo role
					if( ! sameRole )
					{
						// en caso de que no sea null
						if( roleOld != null )
						{
							// quita el nivel al antiguo role
							List< TblNivel > niveles = roleOld.getTblNivels( ) ;
							
							niveles.remove( tc ) ;
							
							// actualiza
							em.merge( roleOld ) ;
						}
						
						// coloca el nivel en el rol nuevo
						List< TblNivel > niveles = role.getTblNivels( ) ;
						
						if( niveles == null )
						{
							niveles = new ArrayList< TblNivel >( ) ;
							
							role.setTblNivels( niveles ) ;
						}
						
						niveles.add( tc ) ;
						
						em.merge( role ) ;
					}
					
					// verifica que no se encuentre
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					et.commit( ) ;
					
					return true ;
				}
				
			}catch( Exception e )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.ErrorAddingLevel" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblNivel tc = new TblNivel( ) ;
		tc.setNombre( name ) ;
		tc.setStatus( ( byte ) 1 ) ;
		tc.setDescripcion( desc ) ;
		tc.setTblRole( role ) ;
		
		try
		{
			em.persist( tc ) ;
			
			// coloca el nivel en el rol nuevo
			List< TblNivel > niveles = role.getTblNivels( ) ;
			
			if( niveles == null )
			{
				niveles = new ArrayList< TblNivel >( ) ;
				
				role.setTblNivels( niveles ) ;
			}
			
			niveles.add( tc ) ;
			
			em.merge( role ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.ErrorAddingLevel" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_ERROR , 
					e ) ;
		}
		
		return true ;
	}

	public static boolean existActiveLevelByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Level.FindActiveLevelByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblNivel > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveLevelByNameWithoutId( String name , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Level.FindActiveLevelByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblNivel > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblNivel u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveNivel( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveLevelByNameAndRole( String name , int cveRole )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Level.FindActiveLevelByNameAndRole" ) ;
		q.setParameter( "nombre" , name ) ;
		q.setParameter( "role" , cveRole ) ;
		List< TblNivel > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existInactiveLevelByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 120 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "Level.FindInactiveLevelByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblNivel > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseLevel( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.CanNotEraseLevel" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 121 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblNivel tc = em.find( TblNivel.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			// obtiene el rol
			TblRole role = tc.getTblRole( ) ;
			
			// lo borra del role
			role.getTblNivels( ).remove( tc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.ErrorOnRemoveLevel" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateLevel( int cve , String name , String desc , int cveRole )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.CanNotUpdateLevel" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 122 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// toma el tipo de cuenta
			TblRole tcR = em.find( TblRole.class , new Integer( cveRole ) ) ;
			
			// en caos de null
			if( tcR == null )
			{
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.RoleNotExist" , cveRole ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_ROLE_NOT_EXIST , 
						null ) ;
			}
			
			et.begin( ) ;
			
			// obtiene el registro
			TblNivel tc = em.find( TblNivel.class , new Integer( cve ) ) ;
			
			// actualiza valores
			tc.setNombre( name ) ;
			tc.setDescripcion( desc ) ;
			tc.setTblRole( tcR ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.nivel.nuevo.dao.ErrorOnUpdateLevel" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_LEVEL_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblNivel findLevelById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		
		// obtiene el registro
		TblNivel tc = em.find( TblNivel.class , new Integer( cve ) ) ;
		
		return tc ;
	}
	
	public static List< TblNivel > getAllActiveLevels( )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		try
		{
			Query q = em.createNamedQuery( "Level.FindAllActiveLevels" ) ;
			List< TblNivel > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblNivel >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.level.ErrorTryingGetAllActiveLevels" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_LEVELS , 
					e ) ;
		}
	}
	
	public static List< TblNivel > getAllActiveLevelsFromRole( int cveRole )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			Query q = em.createNamedQuery( "Level.FindAllActiveLevelsWithRole" ) ;
			q.setParameter( "role" , new Integer( cveRole ) ) ;
			List< TblNivel > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblNivel >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblNivel >( ) ;
		}
	}
	
	
	

	///////////////  Alertas
	public static Long getNumberOfNotReadedAlertsByUser( int cveUser )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		try
		{
			Query q = em.createNamedQuery( "Alerts.FindCountNotReadedAlertsByUserId" ) ;
			Long l = ( Long ) q.getSingleResult( ) ;
		
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.level.ErrorTryingGetAllActiveLevels" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_LEVELS , 
					e ) ;
		}
	}
	
	
	

	////////////// Usuarios
	
	public static boolean addNewUser( String login , String email , String name , String pass , int[ ] roles , int[ ] levels , int[ ] counts, TblPaises tblPais )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// ping( 126 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		
		try
		{
			addNewUser( login , email , name , pass , roles , levels , tblPais , et ) ;
			
			// en caso de que si haya agregado el usuario
			// busca el usuario
			TblUsuario usuario = findUserByLogin( login ) ;
			
			// agrega las cuentas
			// recorre las cuenstas
			for( int count : counts )
				addCountToUser( usuario.getCveUsuario( ) , count , et ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorAddingUser" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean addNewUser( String login , String email , String name , String pass , int[ ] roles , int[ ] levels , TblPaises Pais )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_EMPTY_FIELD_NAME , 
					null ) ;
		
		// verifica que login no este vacio
		if( login == null || login.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.EmptyFieldLogin" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_EMPTY_FIELD_NAME , 
					null ) ;
		
		// verifica que pass no este vacio
		if( pass == null || pass.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.EmptyFieldPass" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de haber resultados
		if( existActiveUserByLogin( login ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.UserAlreadyExist" , login ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ALREADY_EXIST , 
					null ) ;
		
		if( email == null )
			email = "" ;
		
		// ping( 127 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveUserByLogin( login ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "User.FindAllInactiveUserByLogin" ) ;
				q.setParameter( "login" , login ) ;
				List< TblUsuario > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblUsuario tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setEmail( email ) ;
					tc.setNombre( name ) ;
					tc.setTblPais(Pais);
					tc.setPswd( MCUtil.encryptPassword( pass ) ) ;
					
					// recorre los roles
					List< TblRole > newRoles = tc.getTblRoles( ) ;
					
					// en caos de null
					if( newRoles == null )
					{
						newRoles = new ArrayList< TblRole >( ) ;
						
						tc.setTblRoles( newRoles ) ;
					}
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
//					et.commit( ) ;
					
					int cveUsuario = tc.getCveUsuario( ) ;
					
					// en caso de que no sea null
					if( roles != null && roles.length > 0 )
					{
						for( int role : roles )
						{
							addRoleToUser( cveUsuario , role , et ) ;
						}
					}
					
					// en caso de que no sea null
					if( levels != null && levels.length > 0 )
					{
						for( int level : levels )
						{
							addLevelToUser( cveUsuario , level ) ;
						}
					}
					
                                        et.commit( ) ;
					return true ;
				}
				
			}catch( Exception e )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorAddingUser" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblUsuario tc = new TblUsuario( ) ;
		tc.setStatus( ( byte ) 1 ) ;
		tc.setEmail( email ) ;
		tc.setNombre( name ) ;
		tc.setLogin( login ) ;
                tc.setTblPais(Pais);
		tc.setPswd( MCUtil.encryptPassword( pass ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
//			et.commit( ) ;
			
			int cveUsuario = tc.getCveUsuario( ) ;
			
			// en caso de que no sea null
			if( roles != null && roles.length > 0 )
			{
				for( int role : roles )
				{
					addRoleToUser( cveUsuario , role , et ) ;
				}
			}
			
			// en caso de que no sea null
			if( levels != null && levels.length > 0 )
			{
				for( int level : levels )
				{
					addLevelToUser( cveUsuario , level ) ;
				}
			}
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorAddingUser" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		et.commit( ) ;
		return true ;
	}
	
	public static boolean addNewUser( String login , String email , String name , String pass , int[ ] roles , int[ ] levels , TblPaises Pais , EntityTransaction et )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_EMPTY_FIELD_NAME , 
					null ) ;
		
		// verifica que login no este vacio
		if( login == null || login.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.EmptyFieldLogin" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_EMPTY_FIELD_NAME , 
					null ) ;
		
		// verifica que pass no este vacio
		if( pass == null || pass.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.EmptyFieldPass" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de haber resultados
		if( existActiveUserByLogin( login ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.UserAlreadyExist" , login ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ALREADY_EXIST , 
					null ) ;
		
		if( email == null )
			email = "" ;
		
		// intenta colocar en el em
//		EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveUserByLogin( login ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "User.FindAllInactiveUserByLogin" ) ;
				q.setParameter( "login" , login ) ;
				List< TblUsuario > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblUsuario tc = tcs.get( 0 ) ;
					
					tc.setStatus( ( byte ) 1 ) ;
					tc.setEmail( email ) ;
					tc.setNombre( name ) ;
                                        tc.setTblPais( Pais ) ;
					tc.setPswd( MCUtil.encryptPassword( pass ) ) ;
					
					// recorre los roles
					List< TblRole > newRoles = tc.getTblRoles( ) ;
					
					// en caos de null
					if( newRoles == null )
					{
						newRoles = new ArrayList< TblRole >( ) ;
						
						tc.setTblRoles( newRoles ) ;
					}
					
					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
//					et.commit( ) ;
					
					int cveUsuario = tc.getCveUsuario( ) ;
					
					// en caso de que no sea null
					if( roles != null && roles.length > 0 )
					{
						for( int role : roles )
						{
							addRoleToUser( cveUsuario , role , et ) ;
						}
					}
					
					// en caso de que no sea null
					if( levels != null && levels.length > 0 )
					{
						for( int level : levels )
						{
							addLevelToUser( cveUsuario , level , et ) ;
						}
					}
					
					return true ;
				}
				
			}catch( Exception e )
			{
//				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorAddingUser" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblUsuario tc = new TblUsuario( ) ;
		tc.setStatus( ( byte ) 1 ) ;
		tc.setEmail( email ) ;
		tc.setNombre( name ) ;
		tc.setLogin( login ) ;
                tc.setTblPais( Pais ) ;
		tc.setPswd( MCUtil.encryptPassword( pass ) ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
//			et.commit( ) ;
			
			int cveUsuario = tc.getCveUsuario( ) ;
			
			// en caso de que no sea null
			if( roles != null && roles.length > 0 )
			{
				for( int role : roles )
				{
					addRoleToUser( cveUsuario , role , et ) ;
				}
			}
			
			// en caso de que no sea null
			if( levels != null && levels.length > 0 )
			{
				for( int level : levels )
				{
					addLevelToUser( cveUsuario , level , et ) ;
				}
			}
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
//			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorAddingUser" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveUserByLogin( String login )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que login no este vacio
		if( login == null || login.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 128 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "User.FindActiveUserByLogin" ) ;
		q.setParameter( "login" , login ) ;
		List< TblUsuario > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean existActiveUserByLoginWithoutId( String login , int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que login no este vacio
		if( login == null || login.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "User.FindActiveUserByLogin" ) ;
		q.setParameter( "login" , login ) ;
		List< TblUsuario > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
		
		// en caso de que regrese mas de cero elementos
		for( TblUsuario u : res )
		{
			// en caso de que no tenga el mismo cve
			if( u.getCveUsuario( ) != cve )
			{
				// regresa true, puesto que si existe
				return true ;
			}
		}		
		
		
		// no existe
		return false ;
	}
        	
	public static boolean existInactiveUserByLogin( String login )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que login no este vacio
		if( login == null || login.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 130 ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "User.FindInactiveUserByLogin" ) ;
		q.setParameter( "login" , login ) ;
		List< TblUsuario > res = q.getResultList( ) ;
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
        
        public static List< TblUsuario > listaDeUsuariosPorPais( int cvePais )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica si ya existe
		Query q = em.createNamedQuery( "User.BuscaUsuariosPorPaisYStatus" ) ;
		q.setParameter( "cvePais" , cvePais ) ;
		List< TblUsuario > res = q.getResultList( ) ;
	
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return res ;
		
		// no existe
		return new ArrayList< TblUsuario >( ) ;
	}
	
	public static boolean eraseUserById( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseUser" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 131 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorOnRemoveUser" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean eraseRoleFromUser( int cveUser , int cveRole )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveRole < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseRoleFromUser" , cveUser , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ERASE_ROLE_FROM_USER , 
					null ) ;
		
		// ping( 132 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma los roles
			List< TblRole > userRoles = tc.getTblRoles( ) ;
			
			TblRole role = em.find( TblRole.class , new Integer( cveRole ) ) ;
			
			userRoles.remove( role ) ;
			
			tc.setTblRoles( userRoles ) ;
			
			// remueve el usuario del rol
			role.getTblUsuarios( ).remove( tc ) ;
			
			// toma los niveles
			List< TblNivel > niveles = tc.getTblNivels( ) ;
			
			// en caso de que no exista no hace nada
			if( niveles != null && niveles.size( ) > 0 )
			{
				// resultado
				ArrayList< TblNivel > resNiveles = new ArrayList< TblNivel >( ) ;
				
				// recorre los niveles
				for( TblNivel nivel : niveles )
				{
					// en caso de uqe no tenga el mismo rol
					if( nivel.getTblRole( ).getCveRole( ) != cveRole )
						resNiveles.add( nivel ) ;
				}
				
				tc.setTblNivels( resNiveles ) ;
			}
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			e.printStackTrace( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseRoleFromUser" , cveUser , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		
		return true ;
	}
	
	public static boolean eraseLevelFromUser( int cveUser , int cveLevel )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveLevel < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseLevelFromUser" , cveUser , cveLevel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ERASE_LEVEL_FROM_USER , 
					null ) ;
		
		// ping( 133 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma los roles
			List< TblNivel > userLevels = tc.getTblNivels( ) ;
			
			TblNivel level = em.find( TblNivel.class , new Integer( cveLevel ) ) ;
			
			userLevels.remove( level ) ;
			
			tc.setTblNivels( userLevels ) ;
			
			// remueve el usuario del rol
			level.getTblUsuarios( ).remove( tc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			e.printStackTrace( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseLevelFromUser" , cveUser , cveLevel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		
		return true ;
	}
	
	public static boolean eraseCountFromUser( int cveUser , int cveCount )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveCount < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseCountFromUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ERASE_COUNT_FROM_USER , 
					null ) ;
		
		// ping( 134 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma las cuentas
			List< TblCuenta > userCounts = tc.getTblCuentas( ) ;
			
			TblCuenta cuenta = em.find( TblCuenta.class , new Integer( cveCount ) ) ;
			
			userCounts.remove( cuenta ) ;
			
			tc.setTblCuentas( userCounts ) ;
			
			// remueve el usuario del rol
			cuenta.getTblUsuarios( ).remove( tc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			e.printStackTrace( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseCountFromUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		
		return true ;
	}
        
        public static boolean eraseTipeCountFromUser( int cveUser , int cveCount )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveCount < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseCountFromUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ERASE_COUNT_FROM_USER , 
					null ) ;
		
		// ping( 134 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma las cuentas
			List< TblTipoCuenta > userCounts = tc.getTblTipoCuentas( ) ;
			
			TblTipoCuenta cuenta = em.find( TblTipoCuenta.class , new Integer( cveCount ) ) ;
			
			userCounts.remove( cuenta ) ;
			
			tc.setTblTipoCuentas( userCounts ) ;
			
			// remueve el usuario del rol
			cuenta.getTblUsuarios( ).remove( tc ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace( ) ;
			e.printStackTrace( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseCountFromUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		
		return true ;
	}
	
	
        public static boolean addAgencieToUser( int cveUser , int cveAgencie )
                throws
                        MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
                // intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
                try
                {
                    // obtiene el registro
                    TblUsuario tu  = em.find(TblUsuario.class , new Integer( cveUser ) ) ;
                    
                    // en caso de que no lo encuentre
			if( tu == null )
				return false ;
                        
                        // busca la agencia
                        TblAgencia Agencia = em.find( TblAgencia.class , new Integer( cveAgencie ) ) ;
                        
                        // en caso de que no exista
			if( Agencia == null )
				return false ;
                        
                        // en caso de que la encuentre
			// toma la Agencia
			List< TblAgencia > userAgencia = tu.getTblAgencias( ) ;
                        
                        // en caso de que sea null
			if( userAgencia == null )
			{
				userAgencia = new ArrayList< TblAgencia >( ) ;
				
				tu.setTblAgencias( userAgencia ) ;
			}
                        
                        et.begin( ) ;
				
				// agrega
				userAgencia.add( Agencia ) ;
				
				// actualiza los roles
				tu.setTblAgencias( userAgencia ) ;
				
				Agencia.getTblUsuarios().add( tu ) ;
				
				em.merge( tu ) ;
				
				em.flush( ) ;
				
				et.commit( ) ;
                        
                }catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddRoleToUser" , cveUser , cveAgencie ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
        }
        
        public static boolean addRoleToUser( int cveUser , int cveRole )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveRole < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddRoleToUser" , cveUser , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ADD_ROLE_TO_USER , 
					null ) ;
		
		// ping( 135 ) ;
		EntityTransaction et = em.getTransaction( ) ;
		// intenta colocar en el em
		try
		{
                    et.begin( ) ;
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// busca el rol
			TblRole newRole = em.find( TblRole.class , new Integer( cveRole) ) ;
			
			// en caso de que no exista
			if( newRole == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma los roles
			List< TblRole > userRoles = tc.getTblRoles( ) ;
			
			// en caso de que sea null
			if( userRoles == null )
			{
				userRoles = new ArrayList< TblRole >( ) ;
				
				tc.setTblRoles( userRoles ) ;
			}
			
			ArrayList< TblRole > res = new ArrayList< TblRole >( ) ;
			
			boolean existRole = false ;
			
			for( TblRole role : userRoles )
			{
				// en caos de que no sea el mismo
				if( role.getCveRole( ) == cveRole )
				{
					existRole = true ;
					break ;
				}
			}
			
			// en caso de que no exista
			if( ! existRole )
			{				
				// agrega
				userRoles.add( newRole ) ;
				
				// actualiza los roles
				tc.setTblRoles( userRoles ) ;
				
				newRole.getTblUsuarios( ).add( tc ) ;
				
				em.merge( tc ) ;				
				em.flush( ) ;
				et.commit( ) ;
                                
			}
		}catch( Exception e )
		{
                    et.rollback( ) ;
			e.printStackTrace();
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddRoleToUser" , cveUser , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean addRoleToUser( int cveUser , int cveRole , EntityTransaction et )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveRole < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddRoleToUser" , cveUser , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ADD_ROLE_TO_USER , 
					null ) ;
		
		// intenta colocar en el em
//		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// busca el rol
			TblRole newRole = em.find( TblRole.class , new Integer( cveRole) ) ;
			
			// en caso de que no exista
			if( newRole == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma los roles
			List< TblRole > userRoles = tc.getTblRoles( ) ;
			
			// en caso de que sea null
			if( userRoles == null )
			{
				userRoles = new ArrayList< TblRole >( ) ;
				
				tc.setTblRoles( userRoles ) ;
			}
			
			ArrayList< TblRole > res = new ArrayList< TblRole >( ) ;
			
			boolean existRole = false ;
			
			for( TblRole role : userRoles )
			{
				// en caos de que no sea el mismo
				if( role.getCveRole( ) == cveRole )
				{
					existRole = true ;
					break ;
				}
			}
			
			// en caso de que no exista
			if( ! existRole )
			{
//				et.begin( ) ;
				
				// agrega
				userRoles.add( newRole ) ;
				
				// actualiza los roles
				tc.setTblRoles( userRoles ) ;
				
				newRole.getTblUsuarios( ).add( tc ) ;
				
				em.merge( tc ) ;
				
				em.flush( ) ;
				
//				et.commit( ) ;
			}
		}catch( Exception e )
		{
//			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddRoleToUser" , cveUser , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean addLevelToUser( int cveUser , int cveLevel )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveLevel < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddLevelToUser" , cveUser , cveLevel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ADD_LEVEL_TO_USER , 
					null ) ;
		
		// ping( 136 ) ;
		
		// intenta colocar en el em
		try
		{
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// busca el rol
			TblNivel newNivel = em.find( TblNivel.class , new Integer( cveLevel ) ) ;
			
			// en caso de que no exista
			if( newNivel == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma los roles
			List< TblNivel > userLevels = tc.getTblNivels( ) ;
			
			// en caso de que sea null
			if( userLevels == null )
			{
				userLevels = new ArrayList< TblNivel >( ) ;
				
				tc.setTblNivels( userLevels ) ;
			}
			
			ArrayList< TblNivel > res = new ArrayList< TblNivel >( ) ;
			
			boolean existLevel = false ;
			
			for( TblNivel level : userLevels )
			{
				// en caos de que no sea el mismo
				if( level.getCveNivel( ) == cveLevel )
				{
					existLevel = true ;
					break ;
				}
			}
			
			// en caso de que no exista
			if( ! existLevel )
			{				
				// agrega
				userLevels.add( newNivel ) ;
				
				// actualiza los roles
				tc.setTblNivels( userLevels ) ;
				
				newNivel.getTblUsuarios( ).add( tc ) ;
				
				em.merge( tc ) ;
				
				em.flush( ) ;
				
			}
		}catch( Exception e )
		{
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddLevelToUser" , cveUser , cveLevel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean addLevelToUser( int cveUser , int cveLevel , EntityTransaction et )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveLevel < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddLevelToUser" , cveUser , cveLevel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ADD_LEVEL_TO_USER , 
					null ) ;
		
		// intenta colocar en el em
//		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// busca el rol
			TblNivel newNivel = em.find( TblNivel.class , new Integer( cveLevel ) ) ;
			
			// en caso de que no exista
			if( newNivel == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma los roles
			List< TblNivel > userLevels = tc.getTblNivels( ) ;
			
			// en caso de que sea null
			if( userLevels == null )
			{
				userLevels = new ArrayList< TblNivel >( ) ;
				
				tc.setTblNivels( userLevels ) ;
			}
			
			ArrayList< TblNivel > res = new ArrayList< TblNivel >( ) ;
			
			boolean existLevel = false ;
			
			for( TblNivel level : userLevels )
			{
				// en caos de que no sea el mismo
				if( level.getCveNivel( ) == cveLevel )
				{
					existLevel = true ;
					break ;
				}
			}
			
			// en caso de que no exista
			if( ! existLevel )
			{
//				et.begin( ) ;
				
				// agrega
				userLevels.add( newNivel ) ;
				
				// actualiza los roles
				tc.setTblNivels( userLevels ) ;
				
				newNivel.getTblUsuarios( ).add( tc ) ;
				
				em.merge( tc ) ;
				
				em.flush( ) ;
				
//				et.commit( ) ;
			}
		}catch( Exception e )
		{
//			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddLevelToUser" , cveUser , cveLevel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
        public static boolean addCountToUser( int cveUser , int cveCount )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveCount < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddCountToUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ADD_COUNT_TO_USER , 
					null ) ;
		
		// ping( 137 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// busca el rol
			TblCuenta newCount = em.find( TblCuenta.class , new Integer( cveCount ) ) ;
			
			// en caso de que no exista
			if( newCount == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma las cuentas
			List< TblCuenta > userCounts = tc.getTblCuentas( ) ;
			
			// en caso de que sea null
			if( userCounts == null )
			{
				userCounts = new ArrayList< TblCuenta >( ) ;
				
				tc.setTblCuentas( userCounts ) ;
			}
			
			ArrayList< TblCuenta > res = new ArrayList< TblCuenta >( ) ;
			
			boolean existCuenta = false ;
			
			for( TblCuenta cuenta : userCounts )
			{
				// en caos de que no sea el mismo
				if( cuenta.getCveCuenta( ) == cveCount )
				{
					existCuenta = true ;
					break ;
				}
			}
			
			// en caso de que no exista
			if( ! existCuenta )
			{
				et.begin( ) ;
				
				// agrega
				userCounts.add( newCount ) ;
				
				// actualiza los roles
				tc.setTblCuentas( userCounts ) ;
				
				newCount.getTblUsuarios( ).add( tc ) ;
				
				em.merge( tc ) ;
				
				em.flush( ) ;
				
				et.commit( ) ;
			}
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddLevelToUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
        
	public static boolean addTipoCountToUser( int cveUser , int cveCount )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveCount < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddCountToUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ADD_COUNT_TO_USER , 
					null ) ;
		
		// ping( 137 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// busca el rol
			TblTipoCuenta newCount = em.find( TblTipoCuenta.class , new Integer( cveCount ) ) ;
			
			// en caso de que no exista
			if( newCount == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma las cuentas
			List< TblTipoCuenta > userCounts = tc.getTblTipoCuentas( ) ;
			
			// en caso de que sea null
			if( userCounts == null )
			{
				userCounts = new ArrayList< TblTipoCuenta >( ) ;
				
				tc.setTblTipoCuentas( userCounts ) ;
			}
			
			ArrayList< TblTipoCuenta > res = new ArrayList< TblTipoCuenta >( ) ;
			
			boolean existCuenta = false ;
			
			for( TblTipoCuenta cuenta : userCounts )
			{
				// en caos de que no sea el mismo
				if( cuenta.getCveTipoCuenta( ) == cveCount )
				{
					existCuenta = true ;
					break ;
				}
			}
			
			// en caso de que no exista
			if( ! existCuenta )
			{
				et.begin( ) ;
				
				// agrega
				userCounts.add( newCount ) ;
				
				// actualiza los roles
				tc.setTblTipoCuentas( userCounts ) ;
				
				newCount.getTblUsuarios( ).add( tc ) ;
				
				em.merge( tc ) ;
				
				em.flush( ) ;
				
				et.commit( ) ;
			}
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddLevelToUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean addCountToUser( int cveUser , int cveCount , EntityTransaction et )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveUser < 1 || cveCount < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddCountToUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ADD_COUNT_TO_USER , 
					null ) ;
		
		// intenta colocar en el em
//		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cveUser ) ) ;
			
			// en caso de que no lo encuentre
			if( tc == null )
				return false ;
			
			// busca el rol
			TblCuenta newCount = em.find( TblCuenta.class , new Integer( cveCount ) ) ;
			
			// en caso de que no exista
			if( newCount == null )
				return false ;
			
			// en caso de que lo encuentre
			// toma las cuentas
			List< TblCuenta > userCounts = tc.getTblCuentas( ) ;
			
			// en caso de que sea null
			if( userCounts == null )
			{
				userCounts = new ArrayList< TblCuenta >( ) ;
				
				tc.setTblCuentas( userCounts ) ;
			}
			
			ArrayList< TblCuenta > res = new ArrayList< TblCuenta >( ) ;
			
			boolean existCuenta = false ;
			
			for( TblCuenta cuenta : userCounts )
			{
				// en caos de que no sea el mismo
				if( cuenta.getCveCuenta( ) == cveCount )
				{
					existCuenta = true ;
					break ;
				}
			}
			
			// en caso de que no exista
			if( ! existCuenta )
			{
//				et.begin( ) ;
				
				// agrega
				userCounts.add( newCount ) ;
				
				// actualiza los roles
				tc.setTblCuentas( userCounts ) ;
				
				newCount.getTblUsuarios( ).add( tc ) ;
				
				em.merge( tc ) ;
				
				em.flush( ) ;
				
//				et.commit( ) ;
			}
		}catch( Exception e )
		{
//			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotAddLevelToUser" , cveUser , cveCount ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean eraseUserByLogin( String login )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( login == null || login.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotEraseUser" , login ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 138 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			Query q = em.createNamedQuery( "User.FindActiveUserByLogin" ) ;
			q.setParameter( "login" , login ) ;
			List< TblUsuario > res = q.getResultList( ) ;
			
			if( res == null || res.size( ) == 0 )
				return false ;
			
			TblUsuario tc = res.get( 0 ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorOnRemoveUser" , login ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateUser( int cve , String login , String email , String name , String pass , int cvePais )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.CanNotUpdateUser" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_UPDATE , 
					null ) ;
		
		// ping( 139 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblUsuario tc = em.find( TblUsuario.class , new Integer( cve ) ) ;
//			TblPaises pais = new TblPaises();
//                        pais.setCvePais(cvePais);
			// actualiza valores
			tc.setLogin( login ) ;
			tc.setNombre( name ) ;
			tc.setEmail( email ) ;
//			tc.setTblPais( pais ) ;
			tc.setPswd( MCUtil.encryptPassword( pass ) ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
                    e.printStackTrace();
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorOnUpdateUser" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblUsuario findUserByLogin( String login )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que login no este vacio
		if( login == null || login.trim( ).length( ) == 0 )
			// regresa que no existe
			return null ;
		
		// ping( 140 ) ;
//		EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		// verifica si ya existe
		Query q = em.createNamedQuery( "User.FindUserByLogin" ) ;
		q.setParameter( "login" , login ) ;
		List< TblUsuario > res = q.getResultList( ) ;
//		et.commit();
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return res.get( 0 ) ;
		
		// no existe
		return null ;
	}
            
        public static List < TblUsuario > findUserByEmail( String  ema ){
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
            Query q = em.createNamedQuery( "User.FindUserByEmail" ) ;
            q.setParameter( "email", ema ) ;
            List< TblUsuario > res =  q.getResultList( ) ;
            
            // en caso de no haber resultados
            if ( res.size() <= 0 )
                return res;
           
            
            
            return res;
        }
	
	public static TblUsuario findUserById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 0 )
			return null ;
		
		// ping( 141 ) ;
//		EntityTransaction et = em.getTransaction( ) ;
//		et.begin( ) ;
		// obtiene el registro
		TblUsuario tc = em.find( TblUsuario.class , new Integer( cve ) ) ;
//		et.commit();
                closeEntityManager( ) ;
		return tc ;
	}       
	
	public static List< TblUsuario > getAllActiveUsers( )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            	
		try
		{
			Query q = em.createNamedQuery( "User.FindAllActiveUsers" ) ;
			List< TblUsuario > l = q.getResultList( ) ;
		
			// en caso de null
			if( l == null )
				return new ArrayList< TblUsuario >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.level.ErrorTryingGetAllActiveUsers" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_LEVELS , 
					e ) ;
		}
	}

	public static List< TblUsuario > getAllActiveUsersFromBancoRoleAndCount( int cveCuenta , int cvePais )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			Query q = em.createNamedQuery( "User.FindAllActiveUsers" ) ;
			List< TblUsuario > l = q.getResultList( ) ;
		
			// en caso de null
			if( l == null )
				return new ArrayList< TblUsuario >( ) ;
			
//			System.out.println( "Busca usuarios en cuenta: " + cveCuenta ) ;
//			System.out.println( "Usuarios activos: " + l.size( ) ) ;
//			
			// resultados
			List< TblUsuario > users = new ArrayList< TblUsuario >( ) ;
			
			// recorre l
			for( TblUsuario user : l )
			{
//				System.out.println( "Usuario: " + user.getLogin( ) ) ;
//				
				// revisa si es del rol 3
				List< TblRole > roles = user.getTblRoles( ) ;
				
				// si no hay roles
				if( roles == null || roles.size( ) == 0 )
					// continua al siguiente usuario
					continue ;
				
                                if( user.getTblPais( ).getCvePais( ) != cvePais )
                                    continue ;
				
				boolean isInRole = false ;
				
				// si hay roles
				// revisa
				for( TblRole r : roles )
				{
//					System.out.println( "\t\tRole: " + r.getNombre( ) + " - " + r.getCveRole( ) ) ;
//					
					// en caso de que coincida el role
					if( r.getCveRole( ) == 3 )
					{
						isInRole = true ;
						
						break ;
					}
				}
				
				// en cao de que no este en el role
				if( ! isInRole )
					// continua con el siguiente
					continue ;
				
				// en caso de que si este en el rol
				// revisa las cuentas asignadas
				List< TblCuenta > cuentas = user.getTblCuentas( ) ;
				
				// en caos de que no haya cuentas
				if( cuentas == null || cuentas.size( ) == 0 )
					// continua con el siguiente
					continue ;
				
//				System.out.println( "\tTamanio Cuentas: " + cuentas.size( ) ) ;
//				
				//en cao d eque si haya cuentas
				for( TblCuenta c : cuentas )
				{
//					System.out.println( "\t\tCuenta: " + c.getNombre( ) + " - " + c.getCveCuenta( ) ) ;
//					
					// en caso de que sea de la cuenta dada
					if( c.getCveCuenta( ) == cveCuenta )
					{
						users.add( user ) ;
						
						break ;
					}
				}
			}
			
			// en caso de que si haya resultados
			return users ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.level.ErrorTryingGetAllActiveUsers" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_LEVELS , 
					e ) ;
		}
	}
	
	public static List< TblUsuario > getAllActiveUsersFromRoleAndLevel( TblRole role , TblNivel nivel )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// en caso de que no haya role o esta desactivado
			if( role == null || role.getStatus( ) == 0 )
				return new ArrayList< TblUsuario >( ) ;
			
			// en caso de que si haya rol
			List< TblUsuario > roleUsers = role.getTblUsuarios( ) ;
			
			// en caso de que el nivel sea null, querra decir que se refiere a todos los niveles
			if( nivel == null )
				return roleUsers ;
			
			ArrayList< TblUsuario > usuarios = new ArrayList< TblUsuario >( ) ;
			
			int cveNivel = nivel.getCveNivel( ) ;
			
			// recorre los usuarios
			for( TblUsuario user : roleUsers )
			{
				// en caso de que el usuario este desactivado
				if( user.getStatus( ) == 0 )
					continue ;
				
				// en caso de que nivel sea null
				if( nivel == null )
				{
					// quiere decir que todos los niveles
					usuarios.add( user ) ;
					
					// siguiente
					continue ;
				}
				
				// toma los niveles
				List< TblNivel > niveles = user.getTblNivels( ) ;
				
				// los recorre
				for( TblNivel n : niveles )
				{
					// en caso de desactivado
					if( n.getStatus( ) == 0 )
						continue ;
					
					// en caso de que coincida
					if( n.getCveNivel( ) == cveNivel )
					{
						// agrega el usuario
						usuarios.add( user ) ;
						
						// quiebra el ciclo
						break ;
					}
				}
				
				// va al siguiente usuario
			}// termina de recorrer usuarios
			
			return usuarios ;
		}catch( Exception e )
		{
			return new ArrayList< TblUsuario >( ) ;
		}
	}
        
        public static List< TblUsuario > getAllActiveUsersFromCount( TblCuenta cuenta )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// en caso de que no haya cuenta o esta desactivada
			if( cuenta == null || cuenta.getStatus( ) == 0 )
				return new ArrayList< TblUsuario >( ) ;
			
			// en caso de que si haya cuenta
			List< TblUsuario > countUsers = cuenta.getTblUsuarios( ) ;
			
			
			return countUsers ;
		}catch( Exception e )
		{
			return new ArrayList< TblUsuario >( ) ;
		}
	}
	

	////////////// Anios
	
	public static TblAnio getActualYear( )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		java.util.GregorianCalendar d = new java.util.GregorianCalendar( ) ;
		
		int actual = d.get( Calendar.YEAR ) ;
		
		// ping( 144 ) ;
		
		TblAnio anio = em.find( TblAnio.class , new Integer( actual ) ) ;
		
		// en caso de que no exista
		if( anio == null )
		{
			anio = new TblAnio( ) ;
			anio.setAnio( actual ) ;
			
			// intenta colocar en el em		
			
			try
			{
				em.merge( anio ) ;
				
				em.flush( ) ;
				
				
			}catch( Exception e )
			{
				e.printStackTrace( ) ;				
				
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.ErrorAddingAgency" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_ERROR , 
						e ) ;
			}
			
			// trae
			anio = em.find( TblAnio.class , new Integer( actual ) ) ;
		}
		
		return anio ;
	}
        
        
        public static TblTareaPreimplementacion getWorkPreimplementation( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		
		TblTareaPreimplementacion tareaPre = em.find( TblTareaPreimplementacion.class , new Integer( cve ) ) ;
		
				
		return tareaPre ;
	}
	
	
	////////////// Ganadores
        
        public static boolean addNewGanador (   
                                                String gNombre ,
                                                String gApellido ,
                                                String gFec_nac ,
                                                String Email ,
                                                String Tel ,
                                                String Cel ,
                                                String gPasaporte ,
                                                String gVigenciaIni ,
                                                String gVigenciaFin ,
                                                String aNombre ,
                                                String aApellido ,
                                                String aFec_nac ,
                                                String aPasaporte ,
                                                String aVigenciaIni ,
                                                String aVigenciaFin ,
                                                TblPaquete pack ,
                                                String usuario ,
                                                String password
                                                )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                // intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
                
                try
		{
		et.begin( ) ;
                
                TblGanador win = new TblGanador( ) ;
		win.setGNombre( gNombre ) ;
                win.setGApellido( gApellido ) ;
                win.setGFecNacimiento( Date.valueOf( gFec_nac ) ) ;
                win.setEmail( Email ) ;
                win.setTelFijo( Tel ) ;
                win.setTelMovil( Cel ) ;
                win.setGPasaporte( gPasaporte ) ;
                win.setGVigenciaInicio( Date.valueOf( gVigenciaIni ) ) ;
                win.setGVigenciaFin( Date.valueOf( gVigenciaFin ) );
                win.setANombre( aNombre ) ;
                win.setAApellido( aApellido ) ;
                win.setAFecNacimiento( Date.valueOf( aFec_nac ) );
                win.setAPasaporte( aPasaporte ) ;
                win.setAVigenciaInicio( Date.valueOf( aVigenciaIni ) ) ;
                win.setAVigenciaFin( Date.valueOf( aVigenciaFin ) );
                win.setTblPaquete( pack ) ;
                win.setUsuario( usuario ) ;
                win.setPassword( password ) ;
		
		
			em.persist( win ) ;
			
			em.flush( ) ;
			em.refresh( win ) ;
									
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarganadores.errors.ErrorAddingWinner" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
					e ) ;
		}
		
		return true ;
                
        }
        
        
        public static boolean updateGanadores(
                                                String gNombre ,
                                                String gApellido ,
                                                String gFec_nac ,
                                                String Email ,
                                                String Tel ,
                                                String Cel ,
                                                String gPasaporte ,
                                                String gVigenciaIni ,
                                                String gVigenciaFin ,
                                                String aNombre ,
                                                String aApellido ,
                                                String aFec_nac ,
                                                String aPasaporte ,
                                                String aVigenciaIni ,
                                                String aVigenciaFin ,
                                                TblPaquete pack ,
                                                String usuario ,
                                                String password
                                                )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
           List< TblGanador > winn = getWinnerWithPackage( pack.getCvePaquete( ) ) ;
           TblGanador win = new TblGanador( ) ;
           
           for ( TblGanador w : winn )
           {
               win = w ;
           }
           
           // intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
                {
                    et.begin( ) ;
                    
                    // actualiza los valores
                    win.setGNombre( gNombre ) ;
                    win.setGApellido( gApellido ) ;
                    win.setGFecNacimiento( Date.valueOf( gFec_nac ) ) ;
                    win.setEmail( Email ) ;
                    win.setTelFijo( Tel ) ;
                    win.setTelMovil( Cel ) ;
                    win.setGPasaporte( gPasaporte ) ;
                    win.setGVigenciaInicio( Date.valueOf( gVigenciaIni ) ) ;
                    win.setGVigenciaFin( Date.valueOf( gVigenciaFin ) );
                    win.setANombre( aNombre ) ;
                    win.setAApellido( aApellido ) ;
                    win.setAFecNacimiento( Date.valueOf( aFec_nac ) );
                    win.setAPasaporte( aPasaporte ) ;
                    win.setAVigenciaInicio( Date.valueOf( aVigenciaIni ) ) ;
                    win.setAVigenciaFin( Date.valueOf( aVigenciaFin ) );
                    win.setUsuario( usuario ) ;
                    win.setPassword( password ) ;
                    
                        em.persist( win ) ;
			
			em.flush( ) ;
			em.refresh( win ) ;
									
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarganadores.errors.ErrorAddingWinner" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
					e ) ;
		}
		
		return true ;
        }
        
        public static boolean updateGanadorArchivo(
                                                int cveG ,
                                                String archivo ,
                                                int operacion
                                                )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
           TblGanador win = em.find( TblGanador.class , new Integer( cveG ) ) ;
           
           // intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
                {
                    et.begin( ) ;
                    
                    // actualiza los valores de acuerdo a la operacion
                    if ( operacion == 1 ) {
                        win.setArchivoBoleto( archivo ) ;
                    } else if ( operacion == 2 ) {
                        win.setArchivoAgenda( archivo ) ;
                    } else if ( operacion == 3 ) {
                        win.setArchivoCotizacion( archivo ) ;
                    }
                    
                    
                        em.merge( win ) ;
			
			em.flush( ) ;
//			em.refresh( win ) ;
									
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarganadores.errors.ErrorAddingWinner" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
					e ) ;
		}
		
		return true ;
        }
        
        public static boolean updateGanadorFotos(
                                                int cveG ,
                                                String foto1 ,
                                                String foto2 ,
                                                String foto3 ,
                                                String foto4 ,
                                                String texto1 ,
                                                String texto2 ,
                                                String texto3 ,
                                                String texto4 
                                                )
                throws
			MasterCardException
        {
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
           TblGanador win = em.find( TblGanador.class , new Integer( cveG ) ) ;
           
           // intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
                {
                    et.begin( ) ;
                    
                    // actualiza los los campos enviados por el ganador
                    if ( !foto1.equals( "" ) )
                        win.setFoto_1( foto1 ) ;
                    
                    if ( !foto2.equals( "" ) )
                        win.setFoto_2( foto2 ) ;
                    
                    if ( !foto3.equals( "" ) )
                        win.setFoto_3( foto3 ) ;
                    
                    if ( !foto4.equals( "" ) )
                        win.setFoto_4( foto4 ) ;
                    
                    if ( !texto1.equals( "" ) )
                        win.setTexto1( texto1 ) ;
                    
                    if ( !texto2.equals( "" ) )
                        win.setTexto2( texto2 ) ;
                    
                    if ( !texto3.equals( "" ) )
                        win.setTexto3( texto3 ) ;
                    
                    if ( !texto4.equals( "" ) )
                        win.setTexto4( texto4 ) ;
                    
                    
                        em.merge( win ) ;
			
			em.flush( ) ;
//			em.refresh( win ) ;
									
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarganadores.errors.ErrorAddingWinner" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
					e ) ;
		}
		
		return true ;
        }
        
        public static List< TblGanador > getWinnerWithPackage( int cvePaquete )
		throws
			MasterCardException
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		try
                {
                    Query q = em.createNamedQuery( "Ganador.FindWinnerByPackage" ) ;
                    //q.setParameter( "nombre" , name ) ;
                    q.setParameter( "cvePaquete" , cvePaquete ) ;
                    List< TblGanador > l = q.getResultList( ) ;
                    
                    // en caso de null
			if( l == null )
				return new ArrayList< TblGanador > ( ) ;
                        
                        // en caso de que si haya resultados
			return l ;
                }catch( Exception e )
		{
			return new ArrayList< TblGanador > ( ) ;
		}
		
	}
        
// ________________________:::::::::::::::::::::::::::::::::::::::::::::::::::::::: TRANSACCION :::::::::::::::::::::::::::::::	________
        /*
         Valida Mail de usuario que no exista
         */
        public static boolean validMailUser( String mailuser )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
			
            try{
                Query q = em.createNativeQuery("select * from tbl_usuario where email='"+mailuser+"'");
                List< TblGanador > l = q.getResultList( ) ;
                
                if( l == null )
				return false;
                return true;
            }catch( Exception e ){
                return false ;
            }
        }
        
        public static String getNameCuenta( int cveCuenta  )
        {
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try{
                Query q = em.createNativeQuery("select * from tbl_cuenta where cve_cuenta="+cveCuenta);
                List max = q.getResultList();
                String val = "";
                
                if(max.get(0).toString()=="null"){
                    val = "1";
                }else{                    
                    val = max.get(0).toString();
                }
                
                return val;
            }catch( Exception e ){
                return "" ;
            }
        }
        
	////////////// Assets
        public static String getMaxMaterialDeAsset(  )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try{
                Query q = em.createNativeQuery("select max(cve_material) from tbl_material");
                List max = q.getResultList();
                String val = "";
                
                if(max.get(0).toString()=="null"){
                    val = "1";
                }else{                    
                    val = max.get(0).toString();
                }
                
                return val;
            }catch( Exception e ){
                return "" ;
            }
        }
        
        public static TblAsset getAsset( int cveAsset )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            TblAsset asset = em.find( TblAsset.class , new Integer( cveAsset ) ) ;
            return asset;
        }
            
        public static boolean addMaterialDeAsset(
                                                int cveA ,
                                                String archivo
                                                )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
           TblAsset asset = em.find( TblAsset.class , new Integer( cveA ) ) ;
           TblMaterialAsset material = new TblMaterialAsset( ) ;
           
           material.setArchivoMaterial( archivo ) ;
           material.setNombre( archivo ) ;
           material.setDescripcion( archivo ) ;
           material.setTblAsset( asset ) ;
           
           // intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
                et.begin( ) ;
		try
                {   
                        em.persist( material ) ;
			
			em.flush( ) ;
			em.refresh( material ) ;
									
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarganadores.errors.ErrorAddingWinner" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
					e ) ;
		}
		
		return true ;
        }
        
	
	public static boolean addNewAsset( 
							int subcategoria , 
							String nombre , 
							String descripcion , 
							float sencilloLocal , 
							float dobleLocal , 
							float sencilloRegional , 
							float dobleRegional , 
							String fechaEvento , 
							String fechaEntregaBC , 
							String fechaAprobacionBC , 
							String fechaLimiteSoliciturCotizacion , 
							String fechaLimiteRequisicionCompra , 
							String fechaLimiteSubeContrato , 
							String fechaLimiteOrimeraFactura , 
							String fechaConfirmacionSede , 
							String fechaFinCampana , 
							String fechaLimiteSegundaFactura , 
							String fechaLimiteAgenda , 
							String fechaLimiteGanadaores , 
							String fechaLimiteBoletos , 
							String fechaSalida , 
							String fechaRegreso , 
							String fechaEvaluacion , 
							int fechasConfirmadas , 
							int numeroDiasViaje , 
							int flujoImplEvento , 
							int flujoCampEvento , 
							int tipoMoneda , 
							int tipoHabitacion,
							int cvePais ,
                                                        int cveAgencia ,
                                                        int cveFlujoDeAutorizacion
								)
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( descripcion == null )
			descripcion = "" ;
		
		// en caso de haber resultados
		if( existActiveAssetByName( nombre ) )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.AgencyAlreadyExist" , nombre ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ALREADY_EXIST , 
					null ) ;
		
		// busca la subcategoria
		TblSubcateg tblSubcateg = findSubcategoryById( subcategoria ) ;
		
		// en caso de null
		if( tblSubcateg == null )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.SubcategoryDoesNotExist" , subcategoria ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ALREADY_EXIST , 
					null ) ;
		
		// busca el anio
		TblAnio anio = getActualYear( ) ;
		
		TblFlujo flujoImpl = findFlujoById( flujoImplEvento ) ;
		TblFlujo flujoCamp = findFlujoById( flujoCampEvento ) ;
                TblAgencia agencia = findAgencyById( cveAgencia ) ;
                TblFlujoAutorizacion fa = findFlujoAutorizacion ( cveFlujoDeAutorizacion ) ;
		
		// ping( 145 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
		// en caso de que exista desactivado
		if( existInactiveAssetByName( nombre ) )
		{
			// lo activa
			try
			{
				
				// busca
				Query q = em.createNamedQuery( "Asset.FindAllInactiveAssetByName" ) ;
				q.setParameter( "nombre" , nombre ) ;
				List< TblAsset > tcs = q.getResultList( ) ;
				
				if( tcs.size( ) > 0 )
				{
					TblAsset tc = tcs.get( 0 ) ;
					TblPaises pais = new TblPaises();
                                        pais.setCvePais(cvePais);
					tc.setTblPais( pais ) ;
					tc.setStatus( ( byte ) 1 ) ;
					tc.setDescripcion( descripcion ) ;
					tc.setCostoSenLoc( sencilloLocal ) ;
					tc.setCostoDobLoc( dobleLocal ) ;
					tc.setCostoSenReg( sencilloRegional ) ;
					tc.setCostoDobReg( dobleRegional ) ;
					if( fechaEvento != null && fechaEvento.trim( ).length( ) == 10 )
						tc.setFecha( Date.valueOf( fechaEvento ) ) ;
					if( fechaEntregaBC != null && fechaEntregaBC.trim( ).length( ) == 10 )
						tc.setFecEntregaBc( Date.valueOf( fechaEntregaBC ) ) ;
					if( fechaAprobacionBC != null && fechaAprobacionBC.trim( ).length( ) == 10 )
						tc.setFecAprobBc( Date.valueOf( fechaAprobacionBC ) ) ;
					if( fechaLimiteSoliciturCotizacion != null && fechaLimiteSoliciturCotizacion.trim( ).length( ) == 10 )
						tc.setFecLimiteSolCot( Date.valueOf( fechaLimiteSoliciturCotizacion ) ) ;
					if( fechaLimiteRequisicionCompra != null && fechaLimiteRequisicionCompra.trim( ).length( ) == 10 )
						tc.setFecLimReqCompra( Date.valueOf( fechaLimiteRequisicionCompra ) ) ;
					if( fechaLimiteSubeContrato != null && fechaLimiteSubeContrato.trim( ).length( ) == 10 )
						tc.setFecLimSubeCont( Date.valueOf( fechaLimiteSubeContrato ) ) ;
					if( fechaLimiteOrimeraFactura != null && fechaLimiteOrimeraFactura.trim( ).length( ) == 10 )
						tc.setFecLimPrimFact( Date.valueOf( fechaLimiteOrimeraFactura ) ) ;
					if( fechaConfirmacionSede != null && fechaConfirmacionSede.trim( ).length( ) == 10 )
						tc.setFecConfSede( Date.valueOf( fechaConfirmacionSede ) ) ;
					if( fechaFinCampana != null && fechaFinCampana.trim( ).length( ) == 10 )
						tc.setFecFinCamp( Date.valueOf( fechaFinCampana ) ) ;
					if( fechaLimiteSegundaFactura != null && fechaLimiteSegundaFactura.trim( ).length( ) == 10 )
						tc.setFecLimSegFact( Date.valueOf( fechaLimiteSegundaFactura ) ) ;
					if( fechaLimiteAgenda != null && fechaLimiteAgenda.trim( ).length( ) == 10 )
						tc.setFecLimAgenda( Date.valueOf( fechaLimiteAgenda ) ) ;
					if( fechaLimiteGanadaores != null && fechaLimiteGanadaores.trim( ).length( ) == 10 )
						tc.setFecLimGanadores( Date.valueOf( fechaLimiteGanadaores ) ) ;
					if( fechaLimiteBoletos != null && fechaLimiteBoletos.trim( ).length( ) == 10 )
						tc.setFecLimBoletos( Date.valueOf( fechaLimiteBoletos ) ) ;
					if( fechaSalida != null && fechaSalida.trim( ).length( ) == 10 )
						tc.setFecSalida( Date.valueOf( fechaSalida ) ) ;
					if( fechaRegreso != null && fechaRegreso.trim( ).length( ) == 10 )
						tc.setFecRegreso( Date.valueOf( fechaRegreso ) ) ;
					if( fechaEvaluacion != null && fechaEvaluacion.trim( ).length( ) == 10 )
						tc.setFecEva( Date.valueOf( fechaEvaluacion ) ) ;
					tc.setFechasConfirmadas( fechasConfirmadas ) ;
					tc.setNumDiasViaje( numeroDiasViaje ) ;
					tc.setTblAnio( anio ) ;
					tc.setTblSubcateg( tblSubcateg ) ;
					tc.setTblFlujo1( flujoImpl ) ;
					tc.setTblFlujo2( flujoCamp ) ;
					tc.setTipoMoneda( ( byte ) tipoMoneda ) ;
					tc.setTipoHabitacion( ( byte ) tipoHabitacion ) ;
                                        tc.setTblAgencia( agencia ) ;
                                        tc.setTblFlujoAutorizacion( fa ) ;

					em.merge( tc ) ;
					
					em.flush( ) ;
//					em.refresh( tc ) ;
					
					if( flujoImpl != null )
					{
						flujoImpl.getTblAssets1( ).add( tc ) ;
						em.merge( flujoImpl ) ;
						em.flush( ) ;
//						em.refresh( flujoImpl ) ;
					}
					
					if( flujoCamp != null )
					{
						flujoCamp.getTblAssets2( ).add( tc ) ;
						em.merge( flujoCamp ) ;
						em.flush( ) ;
//						em.refresh( flujoCamp ) ;
					}
					
					et.commit( ) ;
					
					return true ;
				}
				
			}catch( Exception e )
			{
				et.rollback( ) ;
				e.printStackTrace( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.ErrorAddingAgency" , e.getMessage( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
						e ) ;
			}
		}
		
		// en caso de que no exista.
		// crea el Objeto
		TblAsset tc = new TblAsset( ) ;
		TblPaises pais = new TblPaises();
                pais.setCvePais(cvePais);
		tc.setTblPais( pais ) ;
                tc.setNombre( nombre ) ;
		tc.setStatus( ( byte ) 1 ) ;
		tc.setDescripcion( descripcion ) ;
		tc.setCostoSenLoc( sencilloLocal ) ;
		tc.setCostoDobLoc( dobleLocal ) ;
		tc.setCostoSenReg( sencilloRegional ) ;
		tc.setCostoDobReg( dobleRegional ) ;
		if( fechaEvento != null && fechaEvento.trim( ).length( ) == 10 )
			tc.setFecha( Date.valueOf( fechaEvento ) ) ;
		if( fechaEntregaBC != null && fechaEntregaBC.trim( ).length( ) == 10 )
			tc.setFecEntregaBc( Date.valueOf( fechaEntregaBC ) ) ;
		if( fechaAprobacionBC != null && fechaAprobacionBC.trim( ).length( ) == 10 )
			tc.setFecAprobBc( Date.valueOf( fechaAprobacionBC ) ) ;
		if( fechaLimiteSoliciturCotizacion != null && fechaLimiteSoliciturCotizacion.trim( ).length( ) == 10 )
			tc.setFecLimiteSolCot( Date.valueOf( fechaLimiteSoliciturCotizacion ) ) ;
		if( fechaLimiteRequisicionCompra != null && fechaLimiteRequisicionCompra.trim( ).length( ) == 10 )
			tc.setFecLimReqCompra( Date.valueOf( fechaLimiteRequisicionCompra ) ) ;
		if( fechaLimiteSubeContrato != null && fechaLimiteSubeContrato.trim( ).length( ) == 10 )
			tc.setFecLimSubeCont( Date.valueOf( fechaLimiteSubeContrato ) ) ;
		if( fechaLimiteOrimeraFactura != null && fechaLimiteOrimeraFactura.trim( ).length( ) == 10 )
			tc.setFecLimPrimFact( Date.valueOf( fechaLimiteOrimeraFactura ) ) ;
		if( fechaConfirmacionSede != null && fechaConfirmacionSede.trim( ).length( ) == 10 )
			tc.setFecConfSede( Date.valueOf( fechaConfirmacionSede ) ) ;
		if( fechaFinCampana != null && fechaFinCampana.trim( ).length( ) == 10 )
			tc.setFecFinCamp( Date.valueOf( fechaFinCampana ) ) ;
		if( fechaLimiteSegundaFactura != null && fechaLimiteSegundaFactura.trim( ).length( ) == 10 )
			tc.setFecLimSegFact( Date.valueOf( fechaLimiteSegundaFactura ) ) ;
		if( fechaLimiteAgenda != null && fechaLimiteAgenda.trim( ).length( ) == 10 )
			tc.setFecLimAgenda( Date.valueOf( fechaLimiteAgenda ) ) ;
		if( fechaLimiteGanadaores != null && fechaLimiteGanadaores.trim( ).length( ) == 10 )
			tc.setFecLimGanadores( Date.valueOf( fechaLimiteGanadaores ) ) ;
		if( fechaLimiteBoletos != null && fechaLimiteBoletos.trim( ).length( ) == 10 )
			tc.setFecLimBoletos( Date.valueOf( fechaLimiteBoletos ) ) ;
		if( fechaSalida != null && fechaSalida.trim( ).length( ) == 10 )
			tc.setFecSalida( Date.valueOf( fechaSalida ) ) ;
		if( fechaRegreso != null && fechaRegreso.trim( ).length( ) == 10 )
			tc.setFecRegreso( Date.valueOf( fechaRegreso ) ) ;
		if( fechaEvaluacion != null && fechaEvaluacion.trim( ).length( ) == 10 )
			tc.setFecEva( Date.valueOf( fechaEvaluacion ) ) ;
		tc.setFechasConfirmadas( fechasConfirmadas ) ;
		tc.setNumDiasViaje( numeroDiasViaje ) ;
		tc.setTblAnio( anio ) ;
		tc.setTblSubcateg( tblSubcateg ) ;
		tc.setTblFlujo1( flujoImpl ) ;
		tc.setTblFlujo2( flujoCamp ) ;
		tc.setTipoMoneda( ( byte ) tipoMoneda ) ;
		tc.setTipoHabitacion( ( byte ) tipoHabitacion ) ;
                tc.setTblAgencia( agencia ) ;
                tc.setTblFlujoAutorizacion( fa ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			if( flujoImpl != null )
			{
				flujoImpl.getTblAssets1( ).add( tc ) ;
				em.merge( flujoImpl ) ;
				em.flush( ) ;
//				em.refresh( flujoImpl ) ;
			}
			
			if( flujoCamp != null )
			{
				flujoCamp.getTblAssets2( ).add( tc ) ;
				em.merge( flujoCamp ) ;
				em.flush( ) ;
//				em.refresh( flujoCamp ) ;
			}
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.ErrorAddingAgency" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
					e ) ;
		}
		
		return true ;
	}
        
        // AGREGA UN ASSET CREADO POR EL ROL REGIONAL
        public static TblAsset addNewAssetByRegional( 
							int subcategoria , 
							String nombre , 
							String descripcion , 
							float sencilloLocal , 
							float dobleLocal , 
							float sencilloRegional , 
							float dobleRegional , 
							String fechaEvento , 
							String fechaEntregaBC , 
							String fechaAprobacionBC , 
							String fechaLimiteSoliciturCotizacion , 
							String fechaLimiteRequisicionCompra , 
							String fechaLimiteSubeContrato , 
							String fechaLimiteOrimeraFactura , 
							String fechaConfirmacionSede , 
							String fechaFinCampana , 
							String fechaLimiteSegundaFactura , 
							String fechaLimiteAgenda , 
							String fechaLimiteGanadaores , 
							String fechaLimiteBoletos , 
							String fechaSalida , 
							String fechaRegreso , 
							String fechaEvaluacion , 
							int fechasConfirmadas , 
							int numeroDiasViaje , 
							int flujoImplEvento , 
							int flujoCampEvento , 
							int tipoMoneda , 
							int tipoHabitacion,
							int cvePais ,
                                                        int cveAgencia ,
                                                        int cveFlujoDeAutorizacion
								)
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.EmptyFieldName" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_EMPTY_FIELD_NAME , 
					null ) ;
		
		// en caso de que no este vacio
		// revisa el desc
		if( descripcion == null )
			descripcion = "" ;
		
//		// en caso de haber resultados
//		if( existActiveAssetByName( nombre ) )
//			// lanza excepcion
//			throw new MasterCardException( 
//					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.AgencyAlreadyExist" , nombre ) , 
//					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ALREADY_EXIST , 
//					null ) ;
		
		// busca la subcategoria
		TblSubcateg tblSubcateg = findSubcategoryById( subcategoria ) ;
		
		// en caso de null
		if( tblSubcateg == null )
			// lanza excepcion
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.SubcategoryDoesNotExist" , subcategoria ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ALREADY_EXIST , 
					null ) ;
		
		// busca el anio
		TblAnio anio = getActualYear( ) ;
		
		TblFlujo flujoImpl = findFlujoById( flujoImplEvento ) ;
		TblFlujo flujoCamp = findFlujoById( flujoCampEvento ) ;
                TblAgencia agencia = findAgencyById( cveAgencia ) ;
                TblFlujoAutorizacion fa = findFlujoAutorizacion ( cveFlujoDeAutorizacion ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		et.begin( ) ;
			
		// crea el Objeto
		TblAsset tc = new TblAsset( ) ;
		TblPaises pais = new TblPaises();
                pais.setCvePais(cvePais);
		tc.setTblPais( pais ) ;
                tc.setNombre( nombre ) ;
		tc.setStatus( ( byte ) 1 ) ;
		tc.setDescripcion( descripcion ) ;
		tc.setCostoSenLoc( sencilloLocal ) ;
		tc.setCostoDobLoc( dobleLocal ) ;
		tc.setCostoSenReg( sencilloRegional ) ;
		tc.setCostoDobReg( dobleRegional ) ;
		if( fechaEvento != null && fechaEvento.trim( ).length( ) == 10 )
			tc.setFecha( Date.valueOf( fechaEvento ) ) ;
		if( fechaEntregaBC != null && fechaEntregaBC.trim( ).length( ) == 10 )
			tc.setFecEntregaBc( Date.valueOf( fechaEntregaBC ) ) ;
		if( fechaAprobacionBC != null && fechaAprobacionBC.trim( ).length( ) == 10 )
			tc.setFecAprobBc( Date.valueOf( fechaAprobacionBC ) ) ;
		if( fechaLimiteSoliciturCotizacion != null && fechaLimiteSoliciturCotizacion.trim( ).length( ) == 10 )
			tc.setFecLimiteSolCot( Date.valueOf( fechaLimiteSoliciturCotizacion ) ) ;
		if( fechaLimiteRequisicionCompra != null && fechaLimiteRequisicionCompra.trim( ).length( ) == 10 )
			tc.setFecLimReqCompra( Date.valueOf( fechaLimiteRequisicionCompra ) ) ;
		if( fechaLimiteSubeContrato != null && fechaLimiteSubeContrato.trim( ).length( ) == 10 )
			tc.setFecLimSubeCont( Date.valueOf( fechaLimiteSubeContrato ) ) ;
		if( fechaLimiteOrimeraFactura != null && fechaLimiteOrimeraFactura.trim( ).length( ) == 10 )
			tc.setFecLimPrimFact( Date.valueOf( fechaLimiteOrimeraFactura ) ) ;
		if( fechaConfirmacionSede != null && fechaConfirmacionSede.trim( ).length( ) == 10 )
			tc.setFecConfSede( Date.valueOf( fechaConfirmacionSede ) ) ;
		if( fechaFinCampana != null && fechaFinCampana.trim( ).length( ) == 10 )
			tc.setFecFinCamp( Date.valueOf( fechaFinCampana ) ) ;
		if( fechaLimiteSegundaFactura != null && fechaLimiteSegundaFactura.trim( ).length( ) == 10 )
			tc.setFecLimSegFact( Date.valueOf( fechaLimiteSegundaFactura ) ) ;
		if( fechaLimiteAgenda != null && fechaLimiteAgenda.trim( ).length( ) == 10 )
			tc.setFecLimAgenda( Date.valueOf( fechaLimiteAgenda ) ) ;
		if( fechaLimiteGanadaores != null && fechaLimiteGanadaores.trim( ).length( ) == 10 )
			tc.setFecLimGanadores( Date.valueOf( fechaLimiteGanadaores ) ) ;
		if( fechaLimiteBoletos != null && fechaLimiteBoletos.trim( ).length( ) == 10 )
			tc.setFecLimBoletos( Date.valueOf( fechaLimiteBoletos ) ) ;
		if( fechaSalida != null && fechaSalida.trim( ).length( ) == 10 )
			tc.setFecSalida( Date.valueOf( fechaSalida ) ) ;
		if( fechaRegreso != null && fechaRegreso.trim( ).length( ) == 10 )
			tc.setFecRegreso( Date.valueOf( fechaRegreso ) ) ;
		if( fechaEvaluacion != null && fechaEvaluacion.trim( ).length( ) == 10 )
			tc.setFecEva( Date.valueOf( fechaEvaluacion ) ) ;
		tc.setFechasConfirmadas( fechasConfirmadas ) ;
		tc.setNumDiasViaje( numeroDiasViaje ) ;
		tc.setTblAnio( anio ) ;
		tc.setTblSubcateg( tblSubcateg ) ;
		tc.setTblFlujo1( flujoImpl ) ;
		tc.setTblFlujo2( flujoCamp ) ;
		tc.setTipoMoneda( ( byte ) tipoMoneda ) ;
		tc.setTipoHabitacion( ( byte ) tipoHabitacion ) ;
                tc.setTblAgencia( agencia ) ;
                tc.setTblFlujoAutorizacion( fa ) ;
		
		try
		{
			em.persist( tc ) ;
			
			em.flush( ) ;
			em.refresh( tc ) ;
			
			if( flujoImpl != null )
			{
				flujoImpl.getTblAssets1( ).add( tc ) ;
				em.merge( flujoImpl ) ;
				em.flush( ) ;
//				em.refresh( flujoImpl ) ;
			}
			
			if( flujoCamp != null )
			{
				flujoCamp.getTblAssets2( ).add( tc ) ;
				em.merge( flujoCamp ) ;
				em.flush( ) ;
//				em.refresh( flujoCamp ) ;
			}
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.ErrorAddingAgency" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
					e ) ;
		}
		
		return tc ;
	}        
	
	public static boolean existActiveAssetByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 146 ) ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Asset.FindActiveAssetByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblAsset > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static TblAsset existActiveAssetByNameWithoutId( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try{
                    // ping( 147 ) ;
                    
                    Query q = em.createNamedQuery( "Asset.FindActiveAssetByNameWithoutId" ) ;
                    //q.setParameter( "nombre" , name ) ;
                    q.setParameter( "id" , cve ) ;
                    TblAsset l = (TblAsset) q.getResultList( ) ;
                    
                    // en caso de null
			if( l == null )
				return new TblAsset ( ) ;
                        
                        // en caso de que si haya resultados
			return l ;
                }catch( Exception e )
		{
			return new TblAsset ( ) ;
		}
	}
	
	public static boolean existInactiveAssetByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 148 ) ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Asset.FindInactiveAssetByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblAsset > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static boolean eraseAsset( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.CanNotEraseAsset" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 149 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblAsset tc = em.find( TblAsset.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
//			System.out.println( "Prepara a modificar el TblAsset " + tc.getStatus( ) ) ;
			
			em.merge( tc ) ;
			// lo borra de los registros donde esta relacionado
			// los anios
			TblAnio anio = tc.getTblAnio( ) ; 
			if( anio != null )
			{
				anio.getTblAssets( ).remove( tc ) ;
				em.merge( anio ) ;
				tc.setTblAnio( null ) ;
				em.merge( tc ) ;
			}
			TblFlujo flujo = tc.getTblFlujo1( ) ;
			// en caso de no null
			if( flujo != null )
			{
				List< TblAsset > assets = flujo.getTblAssets1( ) ;
				if( assets != null && assets.size( ) > 0 )
					assets.remove( tc ) ;
				
				em.merge( flujo ) ;
				tc.setTblFlujo1( null ) ;
				em.merge( tc ) ;
			}
			flujo = tc.getTblFlujo2( ) ;
			// en caso de no null
			if( flujo != null )
			{
				List< TblAsset > assets = flujo.getTblAssets2( ) ;
				if( assets != null && assets.size( ) > 0 )
					assets.remove( tc ) ;
				
				em.merge( flujo ) ;
				tc.setTblFlujo2( null ) ;
				em.merge( tc ) ;
			}
			
			TblSubcateg subc = tc.getTblSubcateg( ) ;
			if( subc != null )
			{
				subc.getTblAssets( ).remove( tc ) ;
				em.merge( subc ) ;
				tc.setTblSubcateg( null ) ;
				em.merge( tc ) ;
			}
			
//			// toma los paquetes
			List< TblPaquete > paqs = tc.getTblPaquetes( ) ;
			
			// en caso de que no sea null
			if( paqs != null && paqs.size( ) > 0 )
			{
				// recorre los paquetes
				for( TblPaquete paq : paqs )
				{
					// nulifica el asset
//					paq.setTblAsset( null ) ;
					paq.setStatus( ( byte ) 0 ) ;
					em.merge( paq ) ;
				}
				
				tc.setTblPaquetes( new java.util.ArrayList< TblPaquete >( ) ) ;
				em.merge( tc ) ;
			}
                        
                        List< TblPaqueteRegional > paqsReg =  getAllPackagesRegionalOfAsset( tc.getCveAsset( ) , 1 ) ;
                        
                        // en caso de que no sea null
                        if( paqsReg != null && !paqsReg.isEmpty( ) )
                        {
                            // Recorre los paquetes
                            for( TblPaqueteRegional pr : paqsReg )
                            {
                                // nulifica los paquetesRegionales
                                pr.setStatus( ( byte ) 0 ) ;
                                em.merge( pr ) ;
                            }
                        }
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.agencia.nuevo.dao.ErrorOnRemoveAgency" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_AGENCY_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean updateAsset( 
			int cveAsset , 
			int subcategoria , 
			String nombre , 
			String descripcion , 
			float sencilloLocal , 
			float dobleLocal , 
			float sencilloRegional , 
			float dobleRegional , 
			String fechaEvento , 
			String fechaEntregaBC , 
			String fechaAprobacionBC , 
			String fechaLimiteSoliciturCotizacion , 
			String fechaLimiteRequisicionCompra , 
			String fechaLimiteSubeContrato , 
			String fechaLimiteOrimeraFactura , 
			String fechaConfirmacionSede , 
			String fechaFinCampana , 
			String fechaLimiteSegundaFactura , 
			String fechaLimiteAgenda , 
			String fechaLimiteGanadaores , 
			String fechaLimiteBoletos , 
			String fechaSalida , 
			String fechaRegreso , 
			String fechaEvaluacion , 
			int fechasConfirmadas , 
			int numeroDiasViaje , 
			int flujoImplEvento , 
			int flujoCampEvento , 
			int tipoMoneda , 
			int tipoHabitacion ,
                        int cveAgencia ,
                        int cveFlujoDeAutorizacion
									)
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveAsset < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.edicion.CanNotUpdateAsset" , cveAsset ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_CAN_NOT_UPDATE , 
					null ) ;
		
//		System.out.println( "entra a update" ) ;
		
		TblFlujo flujoImpl = findFlujoById( flujoImplEvento ) ;
		TblFlujo flujoCamp = findFlujoById( flujoCampEvento ) ;
                TblAgencia agencia = findAgencyById( cveAgencia ) ;
                TblFlujoAutorizacion fa = findFlujoAutorizacion ( cveFlujoDeAutorizacion ) ;
		
		// ping( 150 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// en caso de que no este vacio
			// revisa el desc
			if( descripcion == null )
				descripcion = "" ;
			
			// busca la subcategoria
			TblSubcateg tblSubcateg = findSubcategoryById( subcategoria ) ;
			
			// en caso de null
			if( tblSubcateg == null )
				// lanza excepcion
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.SubcategoryDoesNotExist" , subcategoria ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ALREADY_EXIST , 
						null ) ;
			
			// busca el anio
			TblAnio anio = getActualYear( ) ;
			
			
			// obtiene el registro
			TblAsset tc = em.find( TblAsset.class , new Integer( cveAsset ) ) ;
			
			// actualiza valores
			tc.setNombre( nombre ) ;
			tc.setStatus( ( byte ) 1 ) ;
			tc.setDescripcion( descripcion ) ;
			tc.setCostoSenLoc( sencilloLocal ) ;
			tc.setCostoDobLoc( dobleLocal ) ;
			tc.setCostoSenReg( sencilloRegional ) ;
			tc.setCostoDobReg( dobleRegional ) ;
			if( fechaEvento != null && fechaEvento.trim( ).length( ) == 10 )
				tc.setFecha( Date.valueOf( fechaEvento ) ) ;
			if( fechaEntregaBC != null && fechaEntregaBC.trim( ).length( ) == 10 )
				tc.setFecEntregaBc( Date.valueOf( fechaEntregaBC ) ) ;
			if( fechaAprobacionBC != null && fechaAprobacionBC.trim( ).length( ) == 10 )
				tc.setFecAprobBc( Date.valueOf( fechaAprobacionBC ) ) ;
			if( fechaLimiteSoliciturCotizacion != null && fechaLimiteSoliciturCotizacion.trim( ).length( ) == 10 )
				tc.setFecLimiteSolCot( Date.valueOf( fechaLimiteSoliciturCotizacion ) ) ;
			if( fechaLimiteRequisicionCompra != null && fechaLimiteRequisicionCompra.trim( ).length( ) == 10 )
				tc.setFecLimReqCompra( Date.valueOf( fechaLimiteRequisicionCompra ) ) ;
			if( fechaLimiteSubeContrato != null && fechaLimiteSubeContrato.trim( ).length( ) == 10 )
				tc.setFecLimSubeCont( Date.valueOf( fechaLimiteSubeContrato ) ) ;
			if( fechaLimiteOrimeraFactura != null && fechaLimiteOrimeraFactura.trim( ).length( ) == 10 )
				tc.setFecLimPrimFact( Date.valueOf( fechaLimiteOrimeraFactura ) ) ;
			if( fechaConfirmacionSede != null && fechaConfirmacionSede.trim( ).length( ) == 10 )
				tc.setFecConfSede( Date.valueOf( fechaConfirmacionSede ) ) ;
			if( fechaFinCampana != null && fechaFinCampana.trim( ).length( ) == 10 )
				tc.setFecFinCamp( Date.valueOf( fechaFinCampana ) ) ;
			if( fechaLimiteSegundaFactura != null && fechaLimiteSegundaFactura.trim( ).length( ) == 10 )
				tc.setFecLimSegFact( Date.valueOf( fechaLimiteSegundaFactura ) ) ;
			if( fechaLimiteAgenda != null && fechaLimiteAgenda.trim( ).length( ) == 10 )
				tc.setFecLimAgenda( Date.valueOf( fechaLimiteAgenda ) ) ;
			if( fechaLimiteGanadaores != null && fechaLimiteGanadaores.trim( ).length( ) == 10 )
				tc.setFecLimGanadores( Date.valueOf( fechaLimiteGanadaores ) ) ;
			if( fechaLimiteBoletos != null && fechaLimiteBoletos.trim( ).length( ) == 10 )
				tc.setFecLimBoletos( Date.valueOf( fechaLimiteBoletos ) ) ;
			if( fechaSalida != null && fechaSalida.trim( ).length( ) == 10 )
				tc.setFecSalida( Date.valueOf( fechaSalida ) ) ;
			if( fechaRegreso != null && fechaRegreso.trim( ).length( ) == 10 )
				tc.setFecRegreso( Date.valueOf( fechaRegreso ) ) ;
			if( fechaEvaluacion != null && fechaEvaluacion.trim( ).length( ) == 10 )
				tc.setFecEva( Date.valueOf( fechaEvaluacion ) ) ;
			tc.setFechasConfirmadas( fechasConfirmadas ) ;
			tc.setNumDiasViaje( numeroDiasViaje ) ;
			tc.setTblAnio( anio ) ;
			tc.setTblSubcateg( tblSubcateg ) ;
			tc.setTipoMoneda( ( byte ) tipoMoneda ) ;
			tc.setTipoHabitacion( ( byte ) tipoHabitacion ) ;
                        tc.setTblAgencia( agencia ) ;
                        tc.setTblFlujoAutorizacion( fa ) ;
			
			TblFlujo ant = tc.getTblFlujo1( ) ;
			TblFlujo nue = flujoImpl ;
			
			// en caso de ser diferentes
			if( ant != nue )
			{
				// en caso de que sea dif a null
				if( ant != null )
				{
					ant.getTblAssets1( ).remove( tc ) ;
					
					em.merge( ant ) ;
					em.flush( ) ;
//					em.refresh( ant ) ;
				}
				
				// agrega nuevo
				tc.setTblFlujo1( nue ) ;
				em.merge( tc ) ;
				em.flush( ) ;
//				em.refresh( tc ) ;
				
				if( nue != null )
				{
					nue.getTblAssets1( ).add( tc ) ;
					em.merge( nue ) ;
					em.flush( ) ;
//					em.refresh( nue ) ;
				}
			}
			
			ant = tc.getTblFlujo2( ) ;
			nue = flujoCamp ;
			
			// en caso de ser diferentes
			if( ant != nue )
			{
				// en caso de que sea dif a null
				if( ant != null )
				{
					ant.getTblAssets2( ).remove( tc ) ;
					
					em.merge( ant ) ;
					em.flush( ) ;
//					em.refresh( ant ) ;
				}
				
				// agrega nuevo
				tc.setTblFlujo2( nue ) ;
				em.merge( tc ) ;
				em.flush( ) ;
//				em.refresh( tc ) ;
				
				if( nue != null )
				{
					nue.getTblAssets2( ).add( tc ) ;
					em.merge( nue ) ;
					em.flush( ) ;
//					em.refresh( nue ) ;
				}
			}
			
			em.merge( tc ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.assets.editar.dao.ErrorOnUpdateAsset" , cveAsset , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_ASSET_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static TblAsset findAssetById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		// ping( 151 ) ;
		
		// obtiene el registro
		TblAsset tc = em.find( TblAsset.class , new Integer( cve ) ) ;
		
		return tc ;
	}
	
	public static List< TblAsset > getAllActiveAssets( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 152 ) ;
			
			Query q = em.createNamedQuery( "Asset.FindAllActiveAssets" ) ;
			List< TblAsset > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblAsset >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblAsset >( ) ;
		}
	}
        
        public static List< TblAsset > getAllActiveAssetsByPais( int cvePais )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 152 ) ;
//			if(cvePais.equals()){
//                            cvePais = 0;
//                        }
                        
			Query q = em.createNamedQuery( "Asset.FindAllActiveAssetsByPais" ) ;
                        q.setParameter( "cvePais" , cvePais ) ;
			List< TblAsset > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblAsset >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblAsset >( ) ;
		}
	}
        
        public static List< TblAsset > getAllActiveAssetsByRegional( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{       
			Query q = em.createNamedQuery( "Asset.FindAllActiveAssetsByRegional" ) ;
			List< TblAsset > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblAsset >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblAsset >( ) ;
		}
	}
	
	public static List< TblMaterialAsset > getAllActiveMateriales( int cveAsset )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try
            {
                
                Query q = em.createNamedQuery( "Material.FindAllActiveMaterials" ) ;
                q.setParameter( "cve" , cveAsset ) ;
                List< TblMaterialAsset > l = q.getResultList( ) ;
                
                // en caso de null
                if( l == null )
                    return new ArrayList< TblMaterialAsset > ( ) ;
                
                // en caso de que si haya resultados
                return l ;
                
            }catch( Exception e )
            {
                return new ArrayList< TblMaterialAsset >( ) ;
            }
        }
	
	
///////////////// paquetes

	public static boolean addNewPackages( int cveAsset , int cantidad , int tipoHabitacion , int fondeadoA , int facturadoA )
		throws
		MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// obtiene el asset
		TblAsset asset = findAssetById( cveAsset ) ;
		
		// verifica que nombre no este vacio
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.add.AssetNotExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_CAN_NOT_UPDATE , 
					null ) ;
		
		// en caso de uqe si exista
		
		// ping( 153 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( cveAsset + " - " + cantidad + " - " + tipoHabitacion + " - " + fondeadoA + " - " + facturadoA ) ;
			
			et.begin( ) ;
			
			// recorre
			for( int i = 0 ; i < cantidad ; i++ )
			{
				
				// crea un nuevo registro
				TblPaquete tc = new TblPaquete( ) ;
				
				// coloca los datos
				tc.setBandera( ( byte ) 1 ) ;
				tc.setFacturadoA( facturadoA ) ;
				tc.setFondeado( fondeadoA ) ;
				tc.setHabitacion( tipoHabitacion ) ;
				tc.setStatus( ( byte ) 1 ) ;
				tc.setTblAsset( asset ) ;
				
				em.persist( tc ) ;
				
				// lo agrega en el asset
				asset.getTblPaquetes( ).add( tc ) ;
				
				em.persist( asset ) ;
				
				em.flush( ) ;
				em.refresh( tc ) ;
			}
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.add.ErrorOnUpdatePackageAsset" , cveAsset , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
        
        public static boolean addNewPackagesAndUpdateRegional( TblAsset assetPais , int cantidad , int tipoHabitacion , int fondeadoA , int facturadoA , TblAsset assetRegional )
		throws
		MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                
                // OBTIENE PAQUETES REGIONALES DISPONIBLES
                List< TblPaqueteRegional > PR = getAllPackagesRegionalOfAssetAndFlag( assetRegional.getCveAsset( ) , 1 , 1 ) ;
		
		// en caso de uqe si exista		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( cveAsset + " - " + cantidad + " - " + tipoHabitacion + " - " + fondeadoA + " - " + facturadoA ) ;
			
			et.begin( ) ;
			
			// recorre
			for( int i = 0 ; i < cantidad ; i++ )
			{
				
				// crea un nuevo registro
				TblPaquete tc = new TblPaquete( ) ;
				
				// coloca los datos
				tc.setBandera( ( byte ) 1 ) ;
				tc.setFacturadoA( facturadoA ) ;
				tc.setFondeado( fondeadoA ) ;
				tc.setHabitacion( tipoHabitacion ) ;
				tc.setStatus( ( byte ) 1 ) ;
				tc.setTblAsset( assetPais ) ;
				
				em.persist( tc ) ;
				
				// lo agrega en el asset
				assetPais.getTblPaquetes( ).add( tc ) ;
				
				em.merge( assetPais ) ;
				
				em.flush( ) ;
				em.refresh( tc ) ;
                                
                                // ACTUALIZA UN TblPaqueteRegional
                                for( TblPaqueteRegional pr : PR ) {
                                    // EL TIPO DE HABITACION DEBE COINCIDIR
                                    if( ( pr.getHabitacion( ) == tipoHabitacion ) &&
                                            ( pr.getBandera( ) == 1 ) && ( pr.getPaquete( ) == 0 ) ) {
                                        // ACTUALIZA DATOS DE PAQUETEREGIONAL
                                        pr.setPaquete( tc.getCvePaquete( ) ) ;
                                        pr.setBandera( ( byte ) 2 ) ;
                                        
                                        em.merge( pr ) ;
                                        em.flush( ) ;
//                                        em.refresh( pr ) ;
                                        
                                        break ;
                                    }
                                }
//                                TblPaqueteRegional pr = PR.get( i ) ;
//                                pr.setPaquete( tc.getCvePaquete( ) ) ;
//                                pr.setBandera( ( byte ) 2 ) ;
//                                
//                                em.persist( pr ) ;
////                                em.merge( tc ) ;
//                                em.flush( ) ;
//				em.refresh( pr ) ;
                                
                                // Busca EL O LOS REGISTROS EN LA TABLA DE RELACION DE ASSETREGIONAL-ASSETPAIS POR ID DE ASSETREGIONAL
                                List< TblAssetPaisRegional > tblAssetPaisRegional =
                                        getListaEspecifica( assetRegional.getCveAsset( ) , assetPais.getCveAsset( ) ) ;
                                
                                if( tblAssetPaisRegional.isEmpty() ) {
                                    TblAssetPaisRegional apr = new TblAssetPaisRegional( ) ;
                                
                                    apr.setIdAssetRegional( assetRegional.getCveAsset( ) );
                                    apr.setIdAssetPais(  assetPais.getCveAsset( ) ) ;
                                    em.merge( apr ) ;
    //                                em.merge( tc ) ;
                                    em.flush( ) ;
//                                    em.refresh( apr ) ;
                                }
                                
			}
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.add.ErrorOnUpdatePackageAsset" , assetPais.getCveAsset( ) , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
        //PaquetesRegional
        public static boolean addNewPackagesRegional( int cveAsset , int cantidad , int tipoHabitacion , int fondeadoA , int facturadoA )
		throws
		MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// obtiene el asset
		TblAsset asset = findAssetById( cveAsset ) ;
		
		// verifica que nombre no este vacio
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.add.AssetNotExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_CAN_NOT_UPDATE , 
					null ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( cveAsset + " - " + cantidad + " - " + tipoHabitacion + " - " + fondeadoA + " - " + facturadoA ) ;
			
			et.begin( ) ;
			
			// recorre
			for( int i = 0 ; i < cantidad ; i++ )
			{
				
				// crea un nuevo registro
				TblPaqueteRegional tc = new TblPaqueteRegional( ) ;
				
				// coloca los datos
				tc.setBandera( ( byte ) 1 ) ;
				tc.setFacturadoA( facturadoA ) ;
				tc.setFondeado( fondeadoA ) ;
				tc.setHabitacion( tipoHabitacion ) ;
				tc.setStatus( ( byte ) 1 ) ;
				tc.setTblAsset( asset ) ;
				
				em.persist( tc ) ;
				
				// lo agrega en el asset
				asset.getTblPaqueteRegional( ).add( tc ) ;
				
				em.merge( asset ) ;
				
				em.flush( ) ;
				em.refresh( tc ) ;
			}
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.add.ErrorOnUpdatePackageAsset" , cveAsset , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
        
        public static boolean regionalRegresaPaquetes( List< TblPaqueteRegional > listaPaquetes  )
                throws
                        MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            EntityTransaction et = em.getTransaction( ) ;
            
            et.begin( ) ;
            for ( TblPaqueteRegional paqRegional : listaPaquetes ) {                // obtiene el asset del pais
                
                
                TblPaquete paqPais = em.find( TblPaquete.class , new Integer( paqRegional.getPaquete( ) ) ) ;
                paqPais.setStatus( ( byte ) 2 ) ;
                paqPais.setBandera( ( byte ) 3 ) ;
                em.merge( paqPais ) ;
                em.flush( ) ;
//                em.refresh( paqPais ) ;
                
                paqRegional.setPaquete( 0 ) ;
                paqRegional.setBandera( ( byte ) 1 ) ;
                em.merge( paqRegional ) ;
                em.flush( ) ;
//                em.refresh( paqRegional ) ;
                
            }
            
            et.commit( ) ;
            return true;
        }
        
	public static java.util.List< TblPaquete > getAllPackagesOfAsset( int cveAsset , int tipoHabitacion , int fondeadoA , int facturadoA , int status )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// obtiene el asset
		TblAsset asset = findAssetById( cveAsset ) ;
		
		// verifica que nombre no este vacio
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.add.AssetNotExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_CAN_NOT_UPDATE , 
					null ) ;
		
		// toma los paquetes
		java.util.List< TblPaquete > packages = asset.getTblPaquetes( ) ;
		java.util.List< TblPaquete > res = new ArrayList< TblPaquete >( ) ;
		
		for( TblPaquete paq : packages )
		{
			if( paq.getStatus( ) != status )
				continue ;
			
			if( paq.getHabitacion( ) == tipoHabitacion && paq.getFacturadoA( ) == facturadoA && paq.getFondeado( ) == fondeadoA )
				res.add( paq ) ;
		}
		
		return res ;
	}
	
	public static java.util.List< TblPaquete > getAllPackagesOfAsset( int cveAsset , int status )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 154 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllPackagesOfAsset" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			List< TblPaquete > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblPaquete >( ) ;
			
			// recorre
			for( TblPaquete p : l )
				em.refresh( p ) ;
			
			List< TblPaquete > res = new ArrayList< TblPaquete >( ) ;
			
			for( TblPaquete p : l )
			{
				// en caso e que no este eliminado
				if( p.getStatus( ) > 0 )
					res.add( p ) ;
			}
			
			// en caso de que si haya resultados
			return res ;
		}catch( Exception e )
		{
			return new ArrayList< TblPaquete >( ) ;
		}
	}
        
        // 
        public static java.util.List< TblPaqueteRegional > getAllPackagesRegionalOfAsset( int cveAsset , int status )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			Query q = em.createNamedQuery( "Package.FindAllPackagesRegionalOfAsset" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			List< TblPaqueteRegional > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblPaqueteRegional >( ) ;
			
			// recorre
			for( TblPaqueteRegional p : l )
				em.refresh( p ) ;
			
			List< TblPaqueteRegional > res = new ArrayList< TblPaqueteRegional >( ) ;
			
			for( TblPaqueteRegional p : l )
			{
				// en caso e que no este eliminado
				if( p.getStatus( ) > 0 )
					res.add( p ) ;
			}
			
			// en caso de que si haya resultados
			return res ;
		}catch( Exception e )
		{
			return new ArrayList< TblPaqueteRegional >( ) ;
		}
	}
        
        public static List< TblPaqueteRegional > getAllPackagesRegionalOfAssetAndFlag( int cveAsset , int status , int bandera )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			Query q = em.createNamedQuery( "Package.FindAllPackagesRegionalOfAssetandFlag" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
                        q.setParameter( "bandera" , bandera ) ;
			List< TblPaqueteRegional > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblPaqueteRegional >( ) ;			
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPaqueteRegional >( ) ;
		}
	}
        
        public static List< TblPaqueteRegional > PaquetesRegionalesPorAssetStatusBanderaYHabitacion( 
                int cveAssetRegion , int status , int bandera , int habitacion, int cveAssetPais )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            List< TblPaqueteRegional > res = new ArrayList< TblPaqueteRegional >( ) ;
		try
		{
			Query q = em.createNamedQuery( "Package.BuscaPaquetesRegionalesPorStatusAssetHabitacionYBandera" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "cveAsset" , cveAssetRegion ) ;
                        q.setParameter( "bandera" , bandera ) ;
                        q.setParameter( "habitacion" , habitacion ) ;
			List< TblPaqueteRegional > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null ) {
                            return new ArrayList< TblPaqueteRegional >( ) ;
                        } else {
                            // recorre lista para PAQUETESREGIONALES DEL ASSET EN CUESTION
                            for( TblPaqueteRegional pr : l ) {
                                // BUSCA SU PAQUETEPAIS RELACIONADO
                                TblPaquete paq = getPackageWhitCveAndStatus( pr.getPaquete( ) ) ;
                                // SI ESTE PERTENECE A UN ASSET DEL PAIS AL QUE SE LE QUIERE QUITAR..
                                if( paq.getTblAsset( ).getTblPais( ).getCvePais( ) == cveAssetPais )
                                {
                                    //SI ESTA DISPONIBLE LO AGREGA AL ARREGLO DE RESPUESTA
                                    if( paq.getBandera( ) == 1 )
                                        res.add( pr ) ;
                                }                                    
                            }
                        }
							
			
			// en caso de que si haya resultados
			return res ;
		}catch( Exception e )
		{
                    e.printStackTrace( ) ;
                    return new ArrayList< TblPaqueteRegional >( ) ;
		}
	}
	
	public static java.util.List< TblPaquete > getAllPackagesOfAssetAndFlag( int cveAsset , int status , int bandera )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 155 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllPackagesOfAssetAndFlag" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "flag" , bandera ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			List< TblPaquete > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l.size( ) == 0 )
				return new ArrayList< TblPaquete >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPaquete >( ) ;
		}
	}
        
        public static TblPaquete getPackageWhitCveAndStatus( int cvePaquete )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
				
		TblPaquete pack = em.find( TblPaquete.class , new Integer( cvePaquete ) ) ;
		
		
		
		return pack ;
	}
        
        public static List< TblPaquete > getPackagesWhitCveAndStatus ( int cvePaquete )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try
		{
			Query q = em.createNamedQuery( "Package.FindPackagesWhitCveAndStatus" ) ;
			q.setParameter( "cvePaquete" , cvePaquete ) ;
			List< TblPaquete > l = q.getResultList( ) ;
			TblPaquete anio = em.find( TblPaquete.class , new Integer( cvePaquete ) ) ;
			// en caso de que no haya resultados
			if( l.size( ) == 0 )
				return new ArrayList< TblPaquete >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPaquete >( ) ;
		}
        }
	
	public static List< TblPaquete > getAllPackagesOfAssetOnFlag( int cveAsset , int tipoHabitacion , int fondeadoA , int facturadoA , int bandera , int status )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 156 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllPackagesWithValues" ) ;
			 
			q.setParameter( "status" , status ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			q.setParameter( "fondeado" , fondeadoA ) ;
			q.setParameter( "facturadoA" , facturadoA ) ;
			q.setParameter( "tipoHabitacion" , tipoHabitacion ) ;
			q.setParameter( "bandera" , bandera ) ;
			
			List< TblPaquete > paquetes = q.getResultList( ) ;
			
			return paquetes ;
			
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.package.nuevo.dao.PackageFindError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		}
	}
	
        public static List< TblPaqueteRegional > getAllPackagesRegionalsOfAssetOnFlag( int cveAsset , int tipoHabitacion , int fondeadoA , int facturadoA , int bandera , int status )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 156 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllPackagesRegionalsWithValues" ) ;
			 
			q.setParameter( "status" , status ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			q.setParameter( "fondeado" , fondeadoA ) ;
			q.setParameter( "facturadoA" , facturadoA ) ;
			q.setParameter( "tipoHabitacion" , tipoHabitacion ) ;
			q.setParameter( "bandera" , bandera ) ;
			
			List< TblPaqueteRegional > paquetes = q.getResultList( ) ;
			
			return paquetes ;
			
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.package.nuevo.dao.PackageFindError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		}
	}
                
	public static java.util.List< TblCuentaPaquete > getAllPackageInCountAndStatusAndFlag( int cveCuenta , int cvePaquete , int status , int bandera )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 157 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllPackageInCountAndStatusAndFlag" ) ;
			 
			q.setParameter( "status" , status ) ;
			q.setParameter( "cvePaquete" , cvePaquete ) ;
			q.setParameter( "cveCuenta" , cveCuenta ) ;
			q.setParameter( "flag" , bandera ) ;
			
			List< TblCuentaPaquete > paquetes = q.getResultList( ) ;
			
			if( paquetes == null )
				return new ArrayList< TblCuentaPaquete >( ) ;
			
			return paquetes ;
			
		}catch( Exception e )
		{
			return new ArrayList< TblCuentaPaquete >( ) ;
		}
	}
	
	public static TblCuentaPaquete findTblCuentaPaqueteById( int cveCuentaPaquete )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 158 ) ;
			
			TblCuentaPaquete res = em.find( TblCuentaPaquete.class , new Integer( cveCuentaPaquete ) ) ;
			
			return res ;
			
		}catch( Exception e )
		{
			return null ;
		}
	}
	
	public static int quantityOfPackagesNotAssigned( int cveAsset , int tipoHabitacion , int fondeadoA , int facturadoA , int status )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
//		System.out.println( "quantityOfPackagesNotAssigned: " + cveAsset + "-" + tipoHabitacion + "-" + fondeadoA + "-" + facturadoA + "-" + status ) ;
//		
		java.util.List< TblPaquete > paquetes = getAllPackagesOfAssetOnFlag( cveAsset , tipoHabitacion , fondeadoA , facturadoA , 1 , status ) ;
		
		int res = 0 ;
		
		int size = paquetes.size( ) ;
		
		if( paquetes != null && size > 0 )
			res += size ;
		
//		System.out.println( "quantityOfPackagesNotAssigned: " + res ) ;
//		
		paquetes = getAllPackagesOfAssetOnFlag( cveAsset , tipoHabitacion , fondeadoA , facturadoA , 3 , status ) ;
		
		size = paquetes.size( ) ;
		
		if( paquetes != null && size > 0 )
			res += size ;
		
//		System.out.println( "quantityOfPackagesNotAssigned: " + res ) ;
//		
		// ahora los paquetes asignados a tipo de cuenta
		paquetes = getAllPackagesOfAssetOnFlag( cveAsset , tipoHabitacion , fondeadoA , facturadoA , 2 , status ) ;
		
		size = paquetes.size( ) ;
		
//		System.out.println( "quantityOfPackagesNotAssigned: size: " + size ) ;
//		
		for( TblPaquete paq : paquetes )
		{
			// toma el tipocuentapaqete
			List< TblTipoCuentaPaquete > tcps = paq.getTblTipoCuentaPaquetes( ) ;
			
			// recorre
			for( TblTipoCuentaPaquete tcp : tcps )
			{
				// en caos de que status = 0
				if( tcp.getStatus( ) == 0 )
					continue ;
				
				// en csao de que este activo
				if( tcp.getBandera( ) == 1 )
				{
					res++ ;
					break ;
				}
			}
		}
		
//		System.out.println( "quantityOfPackagesNotAssigned: " + res ) ;
//		
		return res ;
	}
        
        public static int quantityOfPackagesRegionalsNotAssigned( int cveAsset , int tipoHabitacion , int fondeadoA , int facturadoA , int status )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
//		System.out.println( "quantityOfPackagesNotAssigned: " + cveAsset + "-" + tipoHabitacion + "-" + fondeadoA + "-" + facturadoA + "-" + status ) ;
//		
		List< TblPaqueteRegional > paquetes = getAllPackagesRegionalsOfAssetOnFlag( cveAsset , tipoHabitacion , fondeadoA , facturadoA , 1 , status ) ;
		
		int res = 0 ;
		
		int size = paquetes.size( ) ;
		
		if( !paquetes.isEmpty( ) && size > 0 )
			res += size ;		
//		
		return res ;
	}
	
        public static boolean eraseQuantityOfPackagesRegionals( int cveAsset , int cantidad , int tipoHabitacion , int fondeadoA , int facturadoA , int status )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// paquetes no asignados a tipo de cuenta
		List< TblPaqueteRegional > paquetes = getAllPackagesRegionalsOfAssetOnFlag( cveAsset , tipoHabitacion , fondeadoA , facturadoA , 1 , status ) ;
		
		// ping( 159 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( cveAsset + " - " + cantidad + " - " + tipoHabitacion + " - " + fondeadoA + " - " + facturadoA ) ;
			
			et.begin( ) ;
			
			int borrados = 0 ;
			
			// primero elimina los no asignados
			for( TblPaqueteRegional paq : paquetes )
			{
				// en caso de borrados es mayor igual a cantidad
				if( borrados >= cantidad )
					break ;
				
				// en caso de que sea menor
				// toma el paquete, cambia el status y actualiza
				paq.setStatus( ( byte ) 0 ) ;
				
				em.merge( paq ) ;
				em.flush( ) ;
//				em.refresh( paq ) ;
				
				// incrementa el numero de borrados
				borrados ++ ;
			}
			
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.add.ErrorOnUpdatePackageAsset" , cveAsset , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
        
	public static boolean eraseQuantityOfPackages( int cveAsset , int cantidad , int tipoHabitacion , int fondeadoA , int facturadoA , int status )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// paquetes no asignados a tipo de cuenta
		List< TblPaquete > paquetes = getAllPackagesOfAssetOnFlag( cveAsset , tipoHabitacion , fondeadoA , facturadoA , 1 , status ) ;
		
		// ping( 159 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( cveAsset + " - " + cantidad + " - " + tipoHabitacion + " - " + fondeadoA + " - " + facturadoA ) ;
			
			et.begin( ) ;
			
			int borrados = 0 ;
			
			// primero elimina los no asignados
			for( TblPaquete paq : paquetes )
			{
				// en caso de borrados es mayor igual a cantidad
				if( borrados >= cantidad )
					break ;
				
				// en caso de que sea menor
				// toma el paquete, cambia el status y actualiza
				paq.setStatus( ( byte ) 0 ) ;
				
				em.merge( paq ) ;
				em.flush( ) ;
//				em.refresh( paq ) ;
				
				// incrementa el numero de borrados
				borrados ++ ;
			}
			
			// luego elimina, si es necesario, los regresados
			// en caso de que borrados sea menor a cantidad
			if( borrados < cantidad )
			{
				// paquetes regresados
				List< TblPaquete > paquetesRegresados = getAllPackagesOfAssetOnFlag( cveAsset , tipoHabitacion , fondeadoA , facturadoA , 3 , status ) ;
				
				// primero elimina los no asignados
				for( TblPaquete paq : paquetesRegresados )
				{
					// en caso de borrados es mayor igual a cantidad
					if( borrados >= cantidad )
						break ;
					
					// en caso de que sea menor
					// toma el paquete, cambia el status y actualiza
					paq.setStatus( ( byte ) 0 ) ;
					
					em.merge( paq ) ;
					em.flush( ) ;
//					em.refresh( paq ) ;
					
					// incrementa el numero de borrados
					borrados ++ ;
				}
			}
			
			// luego elimina, si es necesario, los paquetes que ya estan asignados pero que no estan asignados a cuenta
			// en caso de que borrados sea menor a cantidad
			if( borrados < cantidad )
			{
				// paquetes regresados
				List< TblPaquete > paquetesAsignadosATipoCuenta = getAllPackagesOfAssetOnFlag( cveAsset , tipoHabitacion , fondeadoA , facturadoA , 2 , status ) ;
				
				// primero elimina los no asignados
				for( TblPaquete paq : paquetesAsignadosATipoCuenta )
				{
					// en caso de borrados es mayor igual a cantidad
					if( borrados >= cantidad )
						break ;
					
					// toma los tipocuentapaquete
					List< TblTipoCuentaPaquete > tcps = paq.getTblTipoCuentaPaquetes( ) ;
					
					// en caso de que no haya
					if( tcps == null || tcps.size( ) == 0 )
						// continua con el siguiente
						continue ;
					// en csao de que si haya 
					else
					{
						// no asignado a cuenta
						boolean notAsignedToCount = true ;
						
						TblTipoCuentaPaquete tipoCuentaPaquete = null ;
						
						// recorre los paquetes
						for( TblTipoCuentaPaquete tcp : tcps )
						{
							// en caso de que este en bandera 1
							if( tcp.getBandera( ) == 1 )
							{
								notAsignedToCount = false ;
								
								tipoCuentaPaquete = tcp ;
								
								// quiebra
								break ;
							}
						}
						
						// en caso de que no este asignado a cuenta
						if( ! notAsignedToCount )
						{
							// borra
							// toma el paquete, cambia el status y actualiza
							paq.setStatus( ( byte ) 0 ) ;
							
							em.merge( paq ) ;
							em.flush( ) ;
//							em.refresh( paq ) ;
							
							// elimina tipo cuenta paquete
							tipoCuentaPaquete.setBandera( ( byte ) 0 ) ;
							
							em.merge( tipoCuentaPaquete ) ;
							em.flush( ) ;
//							em.refresh( tipoCuentaPaquete ) ;
							
							// incrementa el numero de borrados
							borrados ++ ;
						}
					}
				}
			}
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.add.ErrorOnUpdatePackageAsset" , cveAsset , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean erasePackage( int cve )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cve < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.package.nuevo.dao.CanNotErasePackage" , cve ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_CAN_NOT_ERASE , 
					null ) ;
		
		// ping( 160 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene el registro
			TblPaquete tc = em.find( TblPaquete.class , new Integer( cve ) ) ;
			
			tc.setStatus( ( byte ) 0 ) ;
			
			em.merge( tc ) ;
			
			em.flush( ) ;
//			em.refresh( tc ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.package.nuevo.dao.ErrorOnRemovePackage" , cve , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean asignarPaqueteATipoCuenta( 
						TblAsset asset , 
						int cveTipoCuenta , 
						int tipoHabitacion , 
						int fondeadoA , 
						int facturadoA )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.PackageToAsignNotExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_NOT_EXIST , 
					null ) ;
		
		// verifica que nombre no este vacio
		if( cveTipoCuenta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.CountTypeToAsignNotExist" , cveTipoCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_COUNT_TYPE_NOT_EXIST , 
					null ) ;
		
		// ping( 161 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// obtiene los paquetes
//			List< TblPaquete > paqs = asset.getTblPaquetes( ) ;
			List< TblPaquete > paqs = getAllPackagesOfAssetOnFlag( asset.getCveAsset( ) , tipoHabitacion , fondeadoA , facturadoA , 1 , 1 ) ;
			
			// obtiene el paquete y el tipo de cuenta
			TblPaquete paq = null ;
			
			if( paqs != null && paqs.size( ) > 0 )
				paq = paqs.get( 0 ) ;
			
			// recorre
//			for( TblPaquete p : paqs )
//			{
//				
//				// en caso de que la bandera no sea la correcta
////				if( p.getBandera( ) != 1 )
////					// continua al siguiente
////					continue ;
//				
//				// revisa si es el indicado
//				if(
//					 p.getHabitacion( ) == tipoHabitacion &&
//					 p.getFondeado( ) == fondeadoA && 
//					 p.getFacturadoA( ) == facturadoA
//						)
//				{
//					paq = p ;
//					
//					break ;
//				}
//			}
			
			if( paq == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.NoPackageAvailable" , 
											( ( tipoHabitacion == 1 ) ? "Sencilla" : "Doble" ) , 
											( ( fondeadoA == 2 ) ? "Regional" : "Local" ) , 
											( ( facturadoA == 2 ) ? "Regional" : "Local" ) , 
											asset.getNombre( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_NOT_AVAILABLE , 
						null ) ;
			
			System.out.println( "MasterCardDAO: paquete a asignar: " + paq.getCvePaquete( ) ) ;
			
			TblTipoCuenta tc = em.find( TblTipoCuenta.class , new Integer( cveTipoCuenta ) ) ;
			
			if( tc == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.CountTypeToAsignNotExist" , cveTipoCuenta ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_COUNT_TYPE_NOT_EXIST , 
						null ) ;
			
			// en csao de que ambos existan
			// crea el assettipo
			TblAssetTipo tipo = new TblAssetTipo( ) ;
			
			// verifica si el tipo de cuenta tiene varias cuentas
			List< TblCuenta > cuentasAux = tc.getTblCuentas( ) ;
			List< TblCuenta > cuentas = new ArrayList< TblCuenta >( ) ;
			
			for( TblCuenta c : cuentasAux )
				if( c.getStatus( ) == 1 )
					cuentas.add( c ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			// en caso de que no sea null
			if( cuentas != null )
			{
				int size = cuentas.size( ) ;
				// en caso de cero cuenta
				if( size == 0 )
				{
					// no agrega
				}
				// en caso de una cuenta
//				else if( size == 1 )
//				{
//					// llena los datos
//					tipo.setFechaAlta( now ) ;
//					tipo.setStatus( ( byte ) 1 ) ;
//					tipo.setTblPaquete( paq ) ;
//					tipo.setTblTipoCuenta( tc ) ;
//					tipo.setBandera( ( byte ) 1 ) ;
//					
//					em.persist( tipo ) ;
//					
//					// asigna el tipo al paquete
//					paq.getTblAssetTipos( ).add( tipo ) ;
//					// asigna el tipo al tipo de cuenta
//					tc.getTblAssetTipos( ).add( tipo ) ;
//					
//					em.merge( paq ) ;
//					em.merge( tc ) ;
//					
//					// agrega un TipoCuentaPaquete
//					TblTipoCuentaPaquete tipoCuentaPaq = new TblTipoCuentaPaquete( ) ;
//					tipoCuentaPaq.setFechaAlta( now ) ;
//					tipoCuentaPaq.setStatus( ( byte ) 1 ) ;
//					tipoCuentaPaq.setBandera( ( byte ) 3 ) ;
//					tipoCuentaPaq.setTblPaquete( paq ) ;
//					tipoCuentaPaq.setTblTipoCuenta( tc ) ;
//					
//					em.persist( tipoCuentaPaq ) ;
//					
//					// asigna el tipo cuenta paq al paquete
//					paq.getTblTipoCuentaPaquetes( ).add( tipoCuentaPaq ) ;
//					// asigna el tipo cuenta paq al tipo de cuenta
//					tc.getTblTipoCuentaPaquetes( ).add( tipoCuentaPaq ) ;
//					
//					em.merge( paq ) ;
//					em.merge( tc ) ;
//					
//					// toma la cuenta
//					TblCuenta cuenta = cuentas.get( 0 ) ;
//					
//					// agrea un tbl_cuenta_paq
//					TblCuentaPaquete cuentaPaq = new TblCuentaPaquete( ) ;
//					
//					cuentaPaq.setFechaAlta( now ) ;
//					cuentaPaq.setStatus( ( byte ) 1 ) ;
//					cuentaPaq.setBandera( ( byte ) 1 ) ;
//					cuentaPaq.setTblPaquete( paq ) ;
//					cuentaPaq.setTblCuenta( cuenta ) ;
//					
//					em.persist( cuentaPaq ) ;
//					
//					// asigna el cuenta paq al paquete
//					paq.getTblCuentaPaquetes( ).add( cuentaPaq ) ;
//					// asigna el cuenta paq al tipo de cuenta
//					cuenta.getTblCuentaPaquetes( ).add( cuentaPaq ) ;
//					
//					em.merge( paq ) ;
//					em.merge( cuenta ) ;
//					
//					// cambia el paquete
//					paq.setBandera( ( byte ) 2 ) ;
//					
//					em.merge( paq ) ;
//				}
				// en csao de mas cuentas
				else
				{
					// llena los datos
					tipo.setFechaAlta( now ) ;
					tipo.setStatus( ( byte ) 1 ) ;
					tipo.setTblPaquete( paq ) ;
					tipo.setTblTipoCuenta( tc ) ;
					tipo.setBandera( ( byte ) 1 ) ;
					
					em.persist( tipo ) ;
					
					// asigna el tipo al paquete
					paq.getTblAssetTipos( ).add( tipo ) ;
					// asigna el tipo al tipo de cuenta
					tc.getTblAssetTipos( ).add( tipo ) ;
					
					em.merge( paq ) ;
					em.merge( tc ) ;
					
					// agrega un TipoCuentaPaquete
					TblTipoCuentaPaquete tipoCuentaPaq = new TblTipoCuentaPaquete( ) ;
					tipoCuentaPaq.setFechaAlta( now ) ;
					tipoCuentaPaq.setStatus( ( byte ) 1 ) ;
					tipoCuentaPaq.setBandera( ( byte ) 1 ) ;
					tipoCuentaPaq.setTblPaquete( paq ) ;
					tipoCuentaPaq.setTblTipoCuenta( tc ) ;
					
					em.persist( tipoCuentaPaq ) ;
					
					// asigna el tipo cuenta paq al paquete
					paq.getTblTipoCuentaPaquetes( ).add( tipoCuentaPaq ) ;
					// asigna el tipo cuenta paq al tipo de cuenta
					tc.getTblTipoCuentaPaquetes( ).add( tipoCuentaPaq ) ;
					
					em.merge( paq ) ;
					em.merge( tc ) ;
					
					// cambia el paquete
					paq.setBandera( ( byte ) 2 ) ;
					
					em.merge( paq ) ;
					
					// ya no asigna el paquete a alguna cuenta
				}
			}
			// en caso de null
			else
			{
				// no hace nada
			}
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.ErrorAsignPackageToCountType" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
		        
        public static List< TblTipoCuentaPaquete > getAllPackageInCountTypeAndStatusAndFlag(
							int status , 
							int packageStatus , 
							int cveTipoCuenta , 
							int cveAsset , 
							int flag , 
							int fondeado , 
							int facturadoA , 
							int habitacion , 
							int assetStatus
								)
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 162 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllPackageInCountTypeAndStatusAndFlag" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "packageStatus" , packageStatus ) ;
			q.setParameter( "cveTipoCuenta" , cveTipoCuenta ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			q.setParameter( "flag" , flag ) ;
			q.setParameter( "fondeado" , fondeado ) ;
			q.setParameter( "facturadoA" , facturadoA ) ;
			q.setParameter( "habitacion" , habitacion ) ;
			q.setParameter( "assetStatus" , assetStatus ) ;
			
			List< TblTipoCuentaPaquete > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblTipoCuentaPaquete >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTipoCuentaPaquete >( ) ;
		}
	}
        
        public static List< TblTipoCuentaPaquete > getAllPackageInCountTypeAndStatusBDM(
							int status , 
							int packageStatus ,
                                                        int cveAsset ,
							int cveTipoCuenta )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			
			Query q = em.createNamedQuery( "Package.FindAllPackageInCountTypeAndStatusBDM" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "packageStatus" , packageStatus ) ;
                        q.setParameter( "CveAsset" , cveAsset ) ;
			q.setParameter( "cveTipoCuenta" , cveTipoCuenta ) ;
			
			List< TblTipoCuentaPaquete > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblTipoCuentaPaquete >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTipoCuentaPaquete >( ) ;
		}
	}
	
        public static List< TblTipoCuentaPaquete > getAllPackageInCountTypeAndStatusBDM1(
							int status , 
							int packageStatus ,
							int cveTipoCuenta )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			
			Query q = em.createNamedQuery( "Package.FindAllPackageInCountTypeAndStatusBDM1" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "packageStatus" , packageStatus ) ;
			q.setParameter( "cveTipoCuenta" , cveTipoCuenta ) ;
			
			List< TblTipoCuentaPaquete > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblTipoCuentaPaquete >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTipoCuentaPaquete >( ) ;
		}
	}
        
	public static List< TblCuentaPaquete > getAllPackageInCountAndStatusAndFlagAndAsset(
							int status , 
							int packageStatus , 
							int cvePaquete , 
							int cveAsset , 
							int flag , 
							int fondeado , 
							int facturadoA , 
							int habitacion , 
							int assetStatus
								)
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 163 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllPackageInCountAndStatusAndFlagAndAsset" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "packageStatus" , packageStatus ) ;
			q.setParameter( "cvePaquete" , cvePaquete ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			q.setParameter( "flag" , flag ) ;
			q.setParameter( "fondeado" , fondeado ) ;
			q.setParameter( "facturadoA" , facturadoA ) ;
			q.setParameter( "habitacion" , habitacion ) ;
			q.setParameter( "assetStatus" , assetStatus ) ;
			
			List< TblCuentaPaquete > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCuentaPaquete >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCuentaPaquete >( ) ;
		}
	}
	
	public static List< TblCuentaPaquete > getAllPackageInCountAndStatusAndFlagAndAsset(
							int status , 
							int packageStatus , 
							int assetStatus , 
							int cveAsset , 
							int flag , 
							int habitacion 
								)
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			System.out.println( "status:" + status + " packageStatus:" + packageStatus + " cveAsset:" + cveAsset + " flag:" + flag + " habitacion: " + habitacion + " assetStatus:" + assetStatus ) ;
			// ping( 164 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllPackageInCountAndStatusAndFlagAndAsset2" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "packageStatus" , packageStatus ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			q.setParameter( "bandera" , flag ) ;
			q.setParameter( "habitacion" , habitacion ) ;
			q.setParameter( "assetStatus" , assetStatus ) ;
			
			List< TblCuentaPaquete > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCuentaPaquete >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			return new ArrayList< TblCuentaPaquete >( ) ;
		}
	}
        
        public static List< TblCuentaPaquete > getPaquetesEnCuentaActivosPorTipoANDAsset(
							int status , 
							int packageStatus ,
							int cveAsset , 
							int flag , 
							int fondeado , 
							int facturadoA , 
							int habitacion , 
							int assetStatus , 
                                                        int cuenta 
								)
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			
			
			Query q = em.createNamedQuery( "Package.BuscarPaquetesEnCuentaActivosPorTipoANDAsset" ) ;
			q.setParameter( "status" , status ) ;
			q.setParameter( "packageStatus" , packageStatus ) ;
			q.setParameter( "cveAsset" , cveAsset ) ;
			q.setParameter( "flag" , flag ) ;
			q.setParameter( "fondeado" , fondeado ) ;
			q.setParameter( "facturadoA" , facturadoA ) ;
			q.setParameter( "habitacion" , habitacion ) ;
			q.setParameter( "assetStatus" , assetStatus ) ;
                        q.setParameter( "cuenta" , cuenta ) ;
			
			List< TblCuentaPaquete > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCuentaPaquete >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCuentaPaquete >( ) ;
		}
	}
	
	public static TblTipoCuentaPaquete getTblTipoCuentaPaqueteWithCvePaqueteAndCveTipoCuentaAndStatus( int cveTipoCuenta , int cvePaquete , int status , int packageStatus , int tipoCuentaStatus , int flag )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 165 ) ;
			
			Query q = em.createNamedQuery( "Package.FindAllTblTipoCuentaPaqueteWithCvePaqueteAndCveTipoCuentaAndStatus" ) ;
			q.setParameter( "status" , new Integer( status ) ) ;
			q.setParameter( "packageStatus" , new Integer( packageStatus ) ) ;
			q.setParameter( "cvePaquete" , new Integer( cvePaquete ) ) ;
			q.setParameter( "tipoCuentaStatus" , new Integer( tipoCuentaStatus ) ) ;
			q.setParameter( "cveTipoCuenta" , new Integer( cveTipoCuenta ) ) ;
			q.setParameter( "flag" , new Integer( flag ) ) ;
			List< TblTipoCuentaPaquete > paqs = q.getResultList( ) ;
			
			// en caso de null o vacio
			if( paqs == null || paqs.size( ) == 0 )
				return null ;
			
			return paqs.get( 0 ) ;
				
		}catch( Exception e )
		{
			return null ;
		}
	}
	
	public static void regresarPaquetesDeCuenta( int[ ] asignarInt , String[ ] ids , UserLogin user )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de null
		if( asignarInt == null || ids == null )
			return ;
		
		// en caso deuqe sean tamanios diferentes
		if( asignarInt.length != ids.length )
			return ;
		
		// ping( 166 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// recorre los ids
			for( int i = 0 ; i < ids.length ; i++ )
			{
				// toma los tokens y los convierte
				String tokens[ ] = ids[ i ].split( "-" ) ;
				String cveAssetToken = tokens[ 0 ] ;
				String habitacionToken = tokens[ 1 ] ;
				
				System.out.println( "Token: " + ids[ i ] ) ;
				
				// trata de convertir
				int cveAsset = -1 ;
				int habitacion = -1 ;
				
				try
				{
					cveAsset = Integer.parseInt( cveAssetToken ) ;
					habitacion = Integer.parseInt( habitacionToken ) ;
				}catch( Exception e )
				{
//					et.rollback( ) ;
					throw new MasterCardException( MCUtil.messages.getString( "com.mastercard.assets.web.modules.campania.errors.ErrorDevolverPaquetes" , e.getMessage( ) ) , -1 , e ) ;
				}
				
				int cantidad = asignarInt[ i ] ;
				
				System.out.println( "Cantidad: " + asignarInt[ i ] ) ;
				
				// toma la lista de tblcuentapaquete
				List< TblCuentaPaquete > cuentaPaqs = getAllPackageInCountAndStatusAndFlagAndAsset(
							1 , 1 , 1 , cveAsset , 1 , habitacion ) ;
                                
                                TblAsset asset = findAssetById( cveAsset ) ;
				TblCuenta Cuenta = new TblCuenta( ) ;
				System.out.println( "ListaCuentaPaquetes: " + cuentaPaqs ) ;
				System.out.println( "ListaCuentaPaquetes: " + ( cuentaPaqs == null ? "" : cuentaPaqs.size( ) + "" ) ) ;
				
				// en caso de que sea mayor lo que quiere devolver
				if( cantidad > cuentaPaqs.size( ) )
				{
//					et.rollback( ) ;
					throw new MasterCardException( MCUtil.messages.getString( "com.mastercard.assets.web.modules.campania.errors.ErrorDevolverMasPaquetes" , cuentaPaqs.size( ) , cveAsset , ( habitacion == 1 ? "Sencilla" : "Doble" ) ) , -1 , null ) ;
				}
				
				// recorre
				for( int j = 0 ; j < cantidad ; j++ )
				{
					// toma el tblcuentapauqete
					TblCuentaPaquete tcp = cuentaPaqs.get( j ) ;
					
					System.out.println( "TblCuentaPaquete: " + tcp.getCveCtaPaquete( ) ) ;
					
					int cveTipoCuenta = -1 ;
					int cvePaquete = -1 ;
//					
//					// modifica
//					tcp.setBandera( ( byte ) 3 ) ;
//					tcp.setStatus( ( byte ) 0 ) ;
//					
//					em.persist( tcp ) ;
//					em.flush( ) ;
//					em.refresh( tcp ) ;
					
					TblCuenta cuenta = tcp.getTblCuenta( ) ;
                                        Cuenta = cuenta ;
					
					// en caso de que no sea null
					if( cuenta != null )
					{
						TblTipoCuenta tipoCuenta = cuenta.getTblTipoCuenta( ) ;
						
						if( tipoCuenta != null )
							cveTipoCuenta = tipoCuenta.getCveTipoCuenta( ) ;
					}
					
					System.out.println( "TblCuenta: " + cuenta.getNombre( ) ) ;
					
					TblPaquete p = tcp.getTblPaquete( ) ;
					
					if( p == null )
						continue ;
					
					cvePaquete = p.getCvePaquete( ) ;
					
					System.out.println( "CvePaquete: " + cvePaquete ) ;
					
					// regresa
					regresarPaquete( tcp , getTblTipoCuentaPaqueteWithCvePaqueteAndCveTipoCuentaAndStatus( cveTipoCuenta , cvePaquete, 1 , 1 , 1 , 3 ) , et ) ;
					
				}
//                                throwNotificationTypeReturnsPackage( int numPaq , int tipoHabitacion , TblAsset asset , UserLogin user , TblCuenta cuentaOrigen, EntityTransaction et )
                                System.err.println("Paquetes a regresar :" + cantidad) ;
                                if( cantidad > 0 ){
                                    NotificationUtil.throwNotificationTypeReturnsPackage( cantidad , habitacion , asset , user , Cuenta , et ) ;
                                }
			}
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( MasterCardException e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw e ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( MCUtil.messages.getString( "com.mastercard.assets.web.modules.campania.errors.ErrorDevolverPaquetes" , e.getMessage( ) ) , -1 , e ) ;
		}
	}
	
	public static String getCampaniaATipoCuentaAsignado(TblAsset asset , 
						int cveTipoCuenta , 
						int tipoHabitacion , 
						int fondeadoA , 
						int facturadoA)
                throws 
                        MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            String nomCuenta = " " ;
            
            try{
                int cveAsset = asset.getCveAsset( ) ;
                
                List< TblTipoCuentaPaquete > paqs = getAllPackageInCountTypeAndStatusAndFlag( 
					1 , 
					1 , 
					cveTipoCuenta , 
					cveAsset , 
					3 , 
					fondeadoA , 
					facturadoA , 
					tipoHabitacion , 
					1 ) ;
                
                // recorre los tipoCuentaPaquete
			for( TblTipoCuentaPaquete tcp : paqs )
			{
				int cvePaquete = tcp.getTblPaquete( ).getCvePaquete( ) ;
				// para cada paquete busca en TblCuentaPaquete que se encuentre en bandera 1 (asignado)
				List< TblCuentaPaquete > cuentaPaqs = getAllPackageInCountAndStatusAndFlagAndAsset( 
									1 , 
									1 , 
									cvePaquete , 
									cveAsset , 
									2 , 
									fondeadoA , 
									facturadoA , 
									tipoHabitacion , 
									1 ) ;
                                for( TblCuentaPaquete cP : cuentaPaqs )
                                {    
                                     nomCuenta += cP.getTblCuenta( ).getNombre( ) + "-" ;                                    
                                                                        
//                                    List<  TblCampania > campanias = findAllActivCampaignsByCount ( cP.getTblCuenta( ).getCveCuenta( ) ) ;                                    
                                }
			System.out.println(":::: " + nomCuenta + " ::::");	
                         return nomCuenta ;
			}
                
            }catch( Exception e )
		{
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.ErrorAsignPackageToCountType" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
            return nomCuenta ;
        }
        
        public static int getNumeroDePaqueteATipoCuentaLibres( 
						TblAsset asset , 
						int cveTipoCuenta , 
						int tipoHabitacion , 
						int fondeadoA , 
						int facturadoA )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		System.out.println( "Entra a getNumeroDePaqueteATipoCuentaLibres con : " + tipoHabitacion + " - " + fondeadoA + " - " + facturadoA ) ;
		// verifica que nombre no este vacio
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.PackageToAsignNotExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_NOT_EXIST , 
					null ) ;
		
		// verifica que nombre no este vacio
		if( cveTipoCuenta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.CountTypeToAsignNotExist" , cveTipoCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_COUNT_TYPE_NOT_EXIST , 
					null ) ;
		
		try
		{
			// numero de paquetes que se pueden borrar
			int erasable = 0 ;
			
			// obtiene los registro de la tabla tbl_tipo_cuenta_paquete que esten en bandera 1 (sin asignar a cuenta)
			List< TblTipoCuentaPaquete > paqs = getAllPackageInCountTypeAndStatusAndFlag( 
															1 , 
															1 , 
															cveTipoCuenta , 
															asset.getCveAsset( ) , 
															1 , 
															fondeadoA , 
															facturadoA , 
															tipoHabitacion , 
															1 ) ;
			
			System.out.println( "Paquetes en flag: " + 1 ) ;
			
			// en caso de no ser null
			if( paqs != null )
			{
				// paquetes que se pueden borrar
				erasable += paqs.size( ) ;
				
				System.out.println( "1 , 1 , " + cveTipoCuenta + " , " + asset.getCveAsset( ) + " , 1 , " + fondeadoA + " , " + facturadoA + " , " + tipoHabitacion + " , 1 " ) ;
				System.out.println( "1: " + paqs.size( ) ) ;
			}
			
			int cveAsset = asset.getCveAsset( ) ;
			// los que se encuentran en bandera 2 no se pueden quitar porque estan en proceso de autorizacion por otras cuentas.
			
			// los que se encuentran en bandera 3, ya estan asignados acuenta, y por ende debemos verificar que no esten en campania
			paqs = getAllPackageInCountTypeAndStatusAndFlag( 
					1 , 
					1 , 
					cveTipoCuenta , 
					cveAsset , 
					3 , 
					fondeadoA , 
					facturadoA , 
					tipoHabitacion , 
					1 ) ;
			
			System.out.println( "Segundo: " + paqs.size( ) ) ;
			
			// recorre los tipoCuentaPaquete
			for( TblTipoCuentaPaquete tcp : paqs )
			{
				int cvePaquete = tcp.getTblPaquete( ).getCvePaquete( ) ;
				// para cada paquete busca en TblCuentaPaquete que se encuentre en bandera 1 (asignado)
				List< TblCuentaPaquete > cuentaPaqs = getAllPackageInCountAndStatusAndFlagAndAsset( 
									1 , 
									1 , 
									cvePaquete , 
									cveAsset , 
									1 , 
									fondeadoA , 
									facturadoA , 
									tipoHabitacion , 
									1 ) ;
				
				// suma
				if( cuentaPaqs != null )
				{
					erasable += cuentaPaqs.size( ) ;
					
					System.out.println( "1 - 1 - " + cvePaquete + " - " + cveAsset + " - 1 - " + fondeadoA + " - " + facturadoA + " - " + tipoHabitacion + " - 1" ) ;
					System.out.println( "2: " + cuentaPaqs.size( ) ) ;
				}
				
				// en el caso de bandera 3 no los contamos porque cuando se asigna a bandera 3 en tipoCuentaPquete se asigna a bandera 1
				// los cuales ya se contabilizaron
//				cuentaPaqs = getAllPackageInCountAndStatusAndFlagAndAsset( 
//						1 , 
//						1 , 
//						cvePaquete , 
//						cveAsset , 
//						3 , 
//						fondeadoA , 
//						facturadoA , 
//						tipoHabitacion , 
//						1 ) ;
//	
//				// suma
//				if( cuentaPaqs != null )
//					erasable += cuentaPaqs.size( ) ;
			}
			
			return erasable ;
		}catch( Exception e )
		{
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.ErrorAsignPackageToCountType" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
	}
	
	public static boolean regresarPaqueteATipoCuenta( 
						TblAsset asset , 
						int cveTipoCuenta , 
						int tipoHabitacion , 
						int fondeadoA , 
						int facturadoA , 
						int numPaq )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// toma los paquetes libres
		int paqLibres = getNumeroDePaqueteATipoCuentaLibres( asset , cveTipoCuenta , tipoHabitacion , fondeadoA , facturadoA ) ;
                
                String campaniaNombre = "";
                String cuentaNombre = "" ;
		
		// en caso d que quiera regresar mas de los posibles
		if( paqLibres < numPaq ){
                                      
                   // toma las cuntas por agrupador cvetipoCuenta
                    List< TblCuenta > cuentas = getAllActiveCountsWithCountType( cveTipoCuenta ) ;
                    
                    // recorre las cuentas
                    for ( TblCuenta cuenta : cuentas ) {
                        
                        // toma la clave de la cuenta
                        int cveCuenta = cuenta.getCveCuenta( ) ;
                        
                        // toma las campañas en status != 4 que es cancelado
                        List< TblCampania > campanias = findAllActivCampaignsByCountAndFlag ( cveCuenta ) ;
                        
                            for ( TblCampania campania : campanias ) {
                                
                                if ( campania.getBandera( ) == 4 )
                                    continue;
                                
                                // toma el nombre de la campaña
                                campaniaNombre += campania.getNombre( ) + " - " ;
                                
                            }
                        
                         // toma el nombre de la cuenta
                        cuentaNombre += cuenta.getNombre( ) + " - " ;
                        
                        
                    }
                    
                   System.out.println( "::: " + cuentaNombre + " :::" ) ;
                   System.out.println( "::: " + campaniaNombre + " :::" );
                    //String paqCampania = getCampaniaATipoCuentaAsignado( asset , cveTipoCuenta , tipoHabitacion , fondeadoA , facturadoA ) ; 
                
			// lanza exception
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.ErrorReturnPackageFromCountType" , ( fondeadoA == 1 ) ? "Local" : "Regional" , ( facturadoA == 1 ) ? "Local" : "Regional" , ( tipoHabitacion == 1 ) ? "Sencilla" : "Doble" , paqLibres , cuentaNombre , campaniaNombre ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_FREE_LESS_THAN_ERASE , 
					null ) ;
                }        
		
		System.out.println( "MasterCardDAO: Paquetes a regresar: " + numPaq ) ;
		
		// en caso de que se pueda
		// recorre
		for( int i = 0 ; i < numPaq ; i++ )
		{
			System.out.println( "MasterCardDAO: Entra a borrar: " + i ) ;
			// borra uno por uno
			regresarPaqueteATipoCuenta( asset , cveTipoCuenta , tipoHabitacion , fondeadoA , facturadoA ) ;
		}
		
		return true ;
	}
	
	public static boolean regresarPaqueteATipoCuenta( 
						TblAsset asset , 
						int cveTipoCuenta , 
						int tipoHabitacion , 
						int fondeadoA , 
						int facturadoA )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.PackageToAsignNotExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_NOT_EXIST , 
					null ) ;
		
		// verifica que nombre no este vacio
		if( cveTipoCuenta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.CountTypeToAsignNotExist" , cveTipoCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_COUNT_TYPE_NOT_EXIST , 
					null ) ;
		
		// ping( 167 ) ;
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			int cveAsset = asset.getCveAsset( ) ;
			
			// obtiene los registro de la tabla tbl_tipo_cuenta_paquete que esten en bandera 1 (sin asignar a cuenta)
			List< TblTipoCuentaPaquete > paqs = getAllPackageInCountTypeAndStatusAndFlag( 
															1 , 
															1 , 
															cveTipoCuenta , 
															cveAsset , 
															1 , 
															fondeadoA , 
															facturadoA , 
															tipoHabitacion , 
															1 ) ;
			
			// en csao de que no sea null y tenga alguno
			if( paqs != null && paqs.size( ) > 0 )
			{
				// toma el primero
				TblTipoCuentaPaquete tcp = paqs.get( 0 ) ;
				
				System.out.println( "Modifica tipoCuentaPaquete: " + tcp.getCveTctaPaquete( ) ) ;
				// cambia el status a 0, lo elimina
				tcp.setStatus( ( byte ) 0 ) ;
				
				em.merge( tcp ) ;
				em.flush( ) ;
//				em.refresh( tcp ) ;
				
				// toma el paquete
				TblPaquete paq = tcp.getTblPaquete( ) ;
				
				// cambia bandera de pquete a 1 (sin asignar)
				paq.setBandera( ( byte ) 1 ) ;
				
				em.merge( paq ) ;
				em.flush( ) ;
//				em.refresh( paq ) ;
				
			}
			// en caso de que no haya ninguno del tbl_tipo_cuenta_paquete de bandera 1
			else
			{
				// toma los que tengan bandera 3 (
				paqs = getAllPackageInCountTypeAndStatusAndFlag( 
						1 , 
						1 , 
						cveTipoCuenta , 
						cveAsset , 
						3 , 
						fondeadoA , 
						facturadoA , 
						tipoHabitacion , 
						1 ) ;
				
				// recorre los tipoCuentaPaquete
				for( TblTipoCuentaPaquete tcp : paqs )
				{
					int cvePaquete = tcp.getTblPaquete( ).getCvePaquete( ) ;
					System.out.println( "Entra a tipoCuentaPaquete: " + cvePaquete ) ;
					// para cada paquete busca en TblCuentaPaquete que se encuentre en bandera 1 (asignado)
					List< TblCuentaPaquete > cuentaPaqs = getAllPackageInCountAndStatusAndFlagAndAsset( 
										1 , 
										1 , 
										cvePaquete , 
										cveAsset , 
										1 , 
										fondeadoA , 
										facturadoA , 
										tipoHabitacion , 
										1 ) ;
					
					// en caso de que no este null y si tenga alguno
					if( cuentaPaqs != null && cuentaPaqs.size( ) > 0 )
					{
						// toma el primero
						TblCuentaPaquete cp = cuentaPaqs.get( 0 ) ;
						
						// cambia el status a 0( eliminado )
						cp.setStatus( ( byte ) 0 ) ;
						
						em.merge( cp ) ;
						em.flush( ) ;
//						em.refresh( cp ) ;
						
						// toma el paquete
						TblPaquete p = cp.getTblPaquete( ) ;
						
						// toma el tipoCuenta paquete
						List< TblTipoCuentaPaquete > tblTCPs = p.getTblTipoCuentaPaquetes( ) ;
						
						TblTipoCuentaPaquete tblTCP = null ;
						
						// recorre
						for( TblTipoCuentaPaquete tblTCPAux : tblTCPs )
						{
							// en caso de que bandera sea 3 (asignado a cuenta) y status 1 (activo)
							if( tblTCPAux.getStatus( ) == 1 && tblTCPAux.getBandera( ) == 3 )
							{
								// cambia status a 0
								tblTCPAux.setStatus( ( byte ) 0 ) ;
								
								em.merge( tblTCPAux ) ;
								em.flush( ) ;
//								em.refresh( tblTCPAux ) ;
								
								// quiebra el ciclo
								break ;
							}
						}// termian el for
						
						// cambia bandera de pquete a 1 (sin asignar)
						p.setBandera( ( byte ) 1 ) ;
						
						em.merge( p ) ;
						em.flush( ) ;
//						em.refresh( p ) ;
						
						// quiebra ciclo
						break ;
					}
					
				}
			}
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.packages.ErrorAsignPackageToCountType" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static void regresarPaquete( TblCuentaPaquete cuentaPaquete , TblTipoCuentaPaquete tipoCuentaPaquete )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de null
		if( cuentaPaquete == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountPackageIsNull" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		if( tipoCuentaPaquete == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountPackageIsNull" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		
		// ping( 168 ) ;
		
		// encaso de que no sean nulos los modifica
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// modifica cuentaPaquete
			cuentaPaquete.setBandera( ( byte ) 3 ) ;
			cuentaPaquete.setStatus( ( byte ) 0 ) ;
			
			// actualiza
			em.merge( cuentaPaquete ) ;
			em.flush( ) ;
//			em.refresh( cuentaPaquete ) ;
			
			// toma las cuentas hermanas del tipo de cuenta
			// toma la cuenta
			TblCuenta cuenta = cuentaPaquete.getTblCuenta( ) ;
			
			// cuentas hermanas
			TblTipoCuenta tipoCuenta = cuenta.getTblTipoCuenta( ) ;
			
			List< TblCuenta > cuentas = getAllActiveBindCounts( cuenta.getCveCuenta( ) ) ;
			
			// en caso de que sea tamanio 0, se trata de una cuenta grande
			if( cuentas == null || cuentas.isEmpty() )
			{
				// modifica tipoCuentaPaquete
				tipoCuentaPaquete.setStatus( ( byte ) 0 ) ;
				tipoCuentaPaquete.setBandera( ( byte ) 1 ) ;
				
				em.merge( tipoCuentaPaquete ) ;
				em.flush( ) ;
//				em.refresh( tipoCuentaPaquete ) ;
				
				// modifica en tblPaquete
				TblPaquete paq = tipoCuentaPaquete.getTblPaquete( ) ;
				
				paq.setBandera( ( byte ) 1 ) ;
				em.merge( paq ) ;
				em.flush( ) ;
//				em.refresh( paq ) ;
				
			}
			// en caso de que se trate de cuenta nka
			else
			{
				// modifica tipoCuentaPaquete
				tipoCuentaPaquete.setBandera( ( byte ) 1 ) ;
				
				em.merge( tipoCuentaPaquete ) ;
				em.flush( ) ;
//				em.refresh( tipoCuentaPaquete ) ;
			}
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.ErrorReturnPackage" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
	}
	
	public static void regresarPaquete( TblCuentaPaquete cuentaPaquete , TblTipoCuentaPaquete tipoCuentaPaquete , EntityTransaction et )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de null
		if( cuentaPaquete == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountPackageIsNull" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		if( tipoCuentaPaquete == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountPackageIsNull" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		
		// encaso de que no sean nulos los modifica
		try
		{
			// modifica cuentaPaquete
			cuentaPaquete.setBandera( ( byte ) 3 ) ;
			cuentaPaquete.setStatus( ( byte ) 0 ) ;
			
			// actualiza
			em.merge( cuentaPaquete ) ;
			em.flush( ) ;
//			em.refresh( cuentaPaquete ) ;
			
			System.out.println( "TblCuentaPaquete cambia a 3 y 0: " + cuentaPaquete.getCveCtaPaquete( ) ) ;
			
			// toma las cuentas hermanas del tipo de cuenta
			// toma la cuenta
			TblCuenta cuenta = cuentaPaquete.getTblCuenta( ) ;
			
			// cuentas hermanas
			TblTipoCuenta tipoCuenta = cuenta.getTblTipoCuenta( ) ;
			
			List< TblCuenta > cuentas = getAllActiveBindCounts( cuenta.getCveCuenta( ) ) ;
			
			System.out.println( "CuentasHermanas: " + cuentas.size( ) ) ;
			
			// en caso de que sea tamanio 0, se trata de una cuenta grande
			if( cuentas == null || cuentas.isEmpty() )
			{
				// modifica tipoCuentaPaquete
				tipoCuentaPaquete.setStatus( ( byte ) 0 ) ;
				tipoCuentaPaquete.setBandera( ( byte ) 1 ) ;
				
				em.merge( tipoCuentaPaquete ) ;
				em.flush( ) ;
//				em.refresh( tipoCuentaPaquete ) ;
				
				System.out.println( "TblTipoCuentaPaquete cambia a 0 y 1: " + tipoCuentaPaquete.getCveTctaPaquete( ) ) ;
				
				// modifica en tblPaquete
				TblPaquete paq = tipoCuentaPaquete.getTblPaquete( ) ;
				
				paq.setBandera( ( byte ) 1 ) ;
				em.merge( paq ) ;
				em.flush( ) ;
//				em.refresh( paq ) ;
				
				System.out.println( "TblPaquete cambia a 1: " + paq.getCvePaquete( ) ) ;
				
			}
			// en caso de que se trate de cuenta nka
			else
			{
				// modifica tipoCuentaPaquete
                            tipoCuentaPaquete.setStatus( ( byte ) 0 ) ;// agrege cambio
				tipoCuentaPaquete.setBandera( ( byte ) 1 ) ;
				
				em.merge( tipoCuentaPaquete ) ;
				em.flush( ) ;
//				em.refresh( tipoCuentaPaquete ) ;
                                
                            System.out.println( "TblTipoCuentaPaquete cambia a 0 y 1: " + tipoCuentaPaquete.getCveTctaPaquete( ) ) ;
                                
                                // ::::::: alterado :::::::
                                // modifica en tblPaquete
				TblPaquete paq = tipoCuentaPaquete.getTblPaquete( ) ;
				
				paq.setBandera( ( byte ) 1 ) ;
				em.merge( paq ) ;
				em.flush( ) ;
//				em.refresh( paq ) ;
				
				System.out.println( "TblPaquete cambia a 1: " + paq.getCvePaquete( ) ) ;
                                // ::::::: alterado :::::::
			}
			
			em.flush( ) ;
			
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.ErrorReturnPackage" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
	}
	
	public static void iniciarSolicitarPaquete( TblCuenta cuenta , TblTipoCuentaPaquete tipoCuentaPaquete , TblPaquete paquete , TblUsuario user )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de null
		if( cuenta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountPackageIsNullRequest" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		if( tipoCuentaPaquete == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountPackageIsNullRequest" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		if( paquete == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountPackageIsNullRequest" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					null ) ;
		
		// ping( 169 ) ;
		
		// encaso de que no sean nulos los modifica
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// realiza una solicitud
			TblAssetSolicitud solicitud = new TblAssetSolicitud( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			// llena datos
			solicitud.setFechaAlta( now ) ;
			solicitud.setBandera( ( byte ) 1 ) ;
			solicitud.setStatus( ( byte ) 1 ) ;
			solicitud.setTblCuenta( cuenta ) ;
			solicitud.setTblUsuario( user ) ;
			
			// tipos de cuenta paquetes
			List< TblTipoCuentaPaquete > tipoCuentaPaquetes = new ArrayList< TblTipoCuentaPaquete >( ) ;
			tipoCuentaPaquetes.add( tipoCuentaPaquete ) ;
			solicitud.setTblTipoCuentaPaquetes( tipoCuentaPaquetes ) ;
			solicitud.setTblAssetSolRespuestas( new ArrayList< TblAssetSolRespuesta >( ) ) ;
			
			// actualiza
			em.persist( solicitud ) ;
			em.flush( ) ;
			em.refresh( solicitud ) ;
			
			// agrega a cuenta
			List< TblAssetSolicitud > solicitudesDeCuenta = cuenta.getTblAssetSolicituds( ) ;
			// en caso de null
			if( solicitudesDeCuenta == null )
			{
				solicitudesDeCuenta = new ArrayList< TblAssetSolicitud >( ) ;
				
				// agrega solicitudes
				cuenta.setTblAssetSolicituds( solicitudesDeCuenta ) ;
				
				em.merge( cuenta ) ;
				em.flush( ) ;
//				em.refresh( cuenta ) ;
			}
			
			cuenta.getTblAssetSolicituds( ).add( solicitud ) ;
			
			em.merge( cuenta ) ;
			em.flush( ) ;
//			em.refresh( cuenta ) ;
			
			// agrega a usuario
			List< TblAssetSolicitud > solicitudesDeUsuario = user.getTblAssetSolicituds( ) ;
			// en caso de null
			if( solicitudesDeUsuario == null )
			{
				solicitudesDeUsuario = new ArrayList< TblAssetSolicitud >( ) ;
				
				// agrega solicitudes
				user.setTblAssetSolicituds( solicitudesDeUsuario ) ;
				
				em.merge( user ) ;
				em.flush( ) ;
//				em.refresh( user ) ;
			}
			
			user.getTblAssetSolicituds( ).add( solicitud ) ;
			
			em.merge( user ) ;
			em.flush( ) ;
//			em.refresh( user ) ;
			
			// modifica tipoCuentaPaquete
			List< TblAssetSolicitud > solicitudes = tipoCuentaPaquete.getTblAssetSolicituds( ) ;
			if( solicitudes == null )
				solicitudes = new ArrayList< TblAssetSolicitud >( ) ;
			solicitudes.add( solicitud ) ;
			tipoCuentaPaquete.setTblAssetSolicituds( solicitudes ) ;
			tipoCuentaPaquete.setBandera( ( byte ) 2 ) ;
			
			em.merge( tipoCuentaPaquete ) ;
			em.flush( ) ;
//			em.refresh( tipoCuentaPaquete ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.ErrorRequestPackage" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
	}
	
	public static TblAssetSolicitud findSolicitudById( int cveSolicitud )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// ping( 170 ) ;
		
		TblAssetSolicitud solicitud = em.find( TblAssetSolicitud.class , new Integer( cveSolicitud ) ) ;
		
		if( solicitud != null )
			em.refresh( solicitud ) ;
		
		return solicitud ;
	}
        
        /*Cambios Alets*/
        public static TblCampania getCampania ( int cveCampania )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
            TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
            
            return campania ; 
            
        }
        /*Cambios Alets*/
	
	/*
         Autorizacion de paquetes por medio del nuevo perfil
         */
        public static boolean devolverPaquetes( int cveCuenta , int paquete, int campania )
            throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                try{
                    String sql = "select cve_paquete from tbl_paquete where cve_paquete = (select max(c.cve_paquete) from tbl_campania_paquete c where c.cve_campania="+campania+");";
                    Query q = em.createNativeQuery(sql);
                    List< TblPaquete > max = q.getResultList();
                    if(max!=null){
                        String ids = max.toString().replace("]", "");
                        int id = Integer.parseInt(ids.toString().replace("[", ""));
                        
                        Query qm = em.createNativeQuery("update tbl_cuenta_paquete set bandera=1 where cve_paquete="+id+" and cve_cuenta="+cveCuenta+";");
                    }
                    return true;
                }catch( Exception e ){
                    e.printStackTrace( ) ;
                    return false;
                }
        }
        
        public static List<TblCuentaPaquete> findPackagesByCount( int cveCuenta ){
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            Query q = em.createNamedQuery("Package.FindCountPackagesByCount");
            q.setParameter( "cveCuenta" , cveCuenta ) ;
            List< TblCuentaPaquete > packeges = q.getResultList( ) ;
            return packeges;
        }
        
        public static List<TblCuentaPaquete> getPaquetesAsignados( int cveCuenta, int tipoCuenta ){
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            String sql = "select count(p.cve_paquete) as cantidad,a.cve_asset,a.nombre,p.habitacion,"
                            +"(select count(*) from tbl_cuenta_paquete as k left outer join tbl_paquete as j on j.cve_paquete=k.cve_paquete "
                            +"where k.status=1 and k.cve_cuenta in "
                            +"( select cue.cve_cuenta from tbl_cuenta cue join tbl_tipo_cuenta tc on cue.cve_tipo_cuenta = tc.cve_tipo_cuenta where tc.cve_tipo_cuenta = "+ tipoCuenta +" )"
                            +"and j.cve_asset=p.cve_asset and j.habitacion=p.habitacion and j.status=1 group by j.cve_asset,j.habitacion limit 1) as asigandos "
                            +"from tbl_tipo_cuenta_paquete as c "
                            +"left outer join tbl_paquete as p on c.cve_paquete=p.cve_paquete "
                            +"left outer join tbl_asset as a on a.cve_asset=p.cve_asset "
                            +"where c.cve_tipo_cuenta in (select cve_tipo_cuenta from tbl_cuenta where cve_cuenta="+cveCuenta+") and c.status=1 "
                            +"group by a.cve_asset,a.nombre,p.habitacion; ";
            List<TblCuentaPaquete> paquetes = em.createNativeQuery( sql ).getResultList() ;
            return paquetes;
        }
        
        // regresa Lista de TblCuentaPaquetes de acuerdo a 
        
        public static List< TblCampania > getCountofCampaign( int cveCampania )
            throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try
            {
                em.getTransaction( ).begin();
                Query q = em.createNamedQuery("CampaignType.FindCountCampaignById");
                q.setParameter( "cveCampania" , cveCampania ) ;
                List< TblCampania > l = q.getResultList( ) ;
                
			if( l == null )
				return new ArrayList< TblCampania >( ) ;
                        
		return l ;        
            }catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}  
        }
        
        public static boolean cambiarStatusPaquetes( int cveCuenta , int asset)throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try{
                em.getTransaction( ).begin();
//                String sql_txtu = "update tbl_tipo_cuenta_paquete set bandera=3 where cve_paquete="+asset+" and cve_tipo_cuenta in (select cve_tipo_cuenta from tbl_cuenta where cve_cuenta="+cveCuenta+" );";
                String sql_txtu = "update tbl_tipo_cuenta_paquete set bandera=3 where cve_paquete in (select cve_paquete from tbl_paquete where cve_asset="+asset+" and cve_paquete not in (select cve_paquete from tbl_cuenta_paquete where cve_cuenta="+cveCuenta+")) and status=1 and bandera=1 limit 1;";
                Query qma = em.createNativeQuery(sql_txtu);
                qma.executeUpdate();
                em.getTransaction( ).commit();
                return true;
            }catch( Exception e ){
                    e.printStackTrace( ) ;
                    return false;
                }
        }
        
        public static boolean autorizarPaquetes( int cveCuenta , int paquete, int usuario )
            throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            EntityTransaction et = em.getTransaction( ) ;                    
                try{
                    String sql = "select * from tbl_paquete where bandera=2 and cve_asset="+paquete+" and cve_paquete not in (select cve_paquete from tbl_cuenta_paquete) limit 1;";
//                    em.clear();
//                    em.getTransaction( ).begin();                    
                    Query q = em.createNativeQuery(sql);
//                    em.getTransaction( ).commit();
                    Object max = null ;
                    List l = q.getResultList( ) ;
                    if ( !l.isEmpty() ) {
                        max = l.get( 0 ) ;
                    }
//                    Object max =  q.getResultList().get(0);
                    if(max!=null){
                        Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
                        String ids = max.toString().replace("[", "");
                        ids = ids.substring(0, ids.indexOf(","));
                        int id = Integer.parseInt(ids.toString());
                        TblPaquete paq = new TblPaquete();
                        paq.setCvePaquete(id);
                        TblCuenta cuentaDeSolicitud = new TblCuenta();
                        cuentaDeSolicitud.setCveCuenta(cveCuenta);
                        TblUsuario user_t = new TblUsuario();
                        user_t.setCveUsuario(usuario);
                        
//                        em.getTransaction( ).begin();
//                        Query qm = em.createNativeQuery("select IFNULL(max(cve_cta_paquete),0) from tbl_cuenta_paquete;");
                        Query qm = em.createNativeQuery("select IFNULL(max(cve_cta_paquete),0) from tbl_cuenta_paquete where cve_paquete in (select cve_paquete from tbl_paquete where bandera=2 and cve_asset="+paquete+");");
//                        em.getTransaction( ).commit();
                        List maxm = qm.getResultList();
                        String maxmS = maxm.get(0).toString();
                        String val = "";
                        if(maxmS=="[null]"){
                            val = "0";
                        }else{                    
                            val = maxm.get(0).toString().replace("[", "");
                        }
                        
//                        em.getTransaction( ).begin();
                        et.begin( ) ;
                        TblCuentaPaquete cuentaPaquete = new TblCuentaPaquete( ) ;
			cuentaPaquete.setBandera( ( byte ) 1 ) ;
			cuentaPaquete.setFechaAlta( now ) ;
			cuentaPaquete.setStatus( ( byte ) 1 ) ;
			cuentaPaquete.setTblCuenta( cuentaDeSolicitud ) ;
			cuentaPaquete.setTblPaquete( paq ) ;
//                        cuentaPaquete.setCveCtaPaquete(Integer.parseInt(val.replace("]", ""))+1);
			em.persist( cuentaPaquete ) ;
			em.flush( ) ;
                        em.refresh( cuentaPaquete ) ;
                        em.flush( ) ;
//                        em.getTransaction( ).commit();
                        et.commit( ) ;                        
                        
                    }
                    return true;
                }catch( Exception e ){
                    e.printStackTrace( ) ;
                    et.rollback( ) ;
                    return false;
                }
        }
        
        public static void autorizarSolicitud( int cveSolicitud , UserLogin user )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		System.out.println( "%%% MasterCardDAO-autorizarSolicitud: " + cveSolicitud + " : " + user.getCveUsuario( ) ) ;
		
		// en caso de numero invalido
		if( cveSolicitud < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.RequestIdInvalid" , cveSolicitud ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_REQUEST_ID_INVALID , 
					null ) ;
		
		// en caso de numero invalido
		if( user == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.CountIdInvalid" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_COUNT_ID_INVALID , 
					null ) ;
		
		// ping( 171 ) ;
		
		// encaso de que no sean nulos los modifica
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// realiza una solicitud
			TblAssetSolicitud solicitud = em.find( TblAssetSolicitud.class , new Integer( cveSolicitud ) ) ;
			
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Obtiene la solicitud" + solicitud.getCveSolicitud( ) + " : " + solicitud ) ;
			
			// en caso de null
			if( solicitud == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.RequestIdNotExist" , cveSolicitud ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_REQUEST_ID_NOT_EXIST , 
						null ) ;
			
			// en caso de que la solicitud ya haya sido rechazada
			if( solicitud.getBandera( ) == 3 )
				// no hace nada
				return ;
			
			// Obtiene la cuenta que esta realizando la operacion
			TblCuenta cuentaDeOperacion = em.find( TblCuenta.class , new Integer( user.getActualCountId( ) ) ) ;
			
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Cuenta de operacion: " + cuentaDeOperacion.getCveCuenta( ) + " : " + cuentaDeOperacion ) ;
			
			// en caso de null
			if( cuentaDeOperacion == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.CountIdNotExist" , user.getActualCountId( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_COUNT_ID_NOT_EXIST , 
						null ) ;
			
			// Usuario que hace la operacion
			TblUsuario usuarioDeOperacion = user.getTblUsuario( ) ;
			
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Usuario de operacion: " + usuarioDeOperacion.getCveUsuario( ) + " : " + usuarioDeOperacion ) ;
			
			// en caso de null
			if( usuarioDeOperacion == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.UserIdNotExist" , user.getActualCountId( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_USER_ID_NOT_EXIST , 
						null ) ;
			
			// en caso de que si exista
			
			// cuenta que realizo la solicitud
			TblCuenta cuentaDeSolicitud = solicitud.getTblCuenta( ) ;
			
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Cuenta de solicitud: " + cuentaDeSolicitud.getCveCuenta( ) + " : " + cuentaDeSolicitud ) ;
			
			// toma el tipo de cuenta paquete
			TblTipoCuentaPaquete tipoCuentaPaquete = solicitud.getTblTipoCuentaPaquetes( ).get( 0 ) ;
			
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Tipo Cuenta Paquete: " + tipoCuentaPaquete.getCveTctaPaquete( ) + " : " + tipoCuentaPaquete ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			// registra la respuesta
			TblAssetSolRespuesta respuesta = new TblAssetSolRespuesta( ) ;
			
			System.out.println( "CveSolicitud: " + cveSolicitud + " - User: " + user.getLogin( ) ) ;
			
			respuesta.setAceptado( ( byte ) 1 ) ;
			respuesta.setFechaAlta( now ) ;
			respuesta.setStatus( ( byte ) 1 ) ;
			respuesta.setTblAssetSolicitud( solicitud ) ;
			respuesta.setTblCuenta( cuentaDeOperacion ) ;
			respuesta.setTblUsuario( usuarioDeOperacion ) ;
			
			// registra
			em.persist( respuesta ) ;
			em.flush( ) ;
			em.refresh( respuesta ) ;
			
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Agrego TblAssetSolRespuesta: " + respuesta.getCveRespuesta( ) + " : " + respuesta ) ;
			
			// actualiza los assetSolicitud, las cuenta, y el usuario
			List< TblAssetSolRespuesta > respuestas = solicitud.getTblAssetSolRespuestas( ) ;
			if( respuestas == null )
				respuestas = new ArrayList< TblAssetSolRespuesta >( ) ;
			respuestas.add( respuesta ) ;
			solicitud.setTblAssetSolRespuestas( respuestas ) ;
			em.merge( solicitud ) ;
			em.flush( ) ;
//			em.refresh( solicitud ) ;
			
			respuestas = cuentaDeOperacion.getTblAssetSolRespuestas( ) ;
			if( respuestas == null )
				respuestas = new ArrayList< TblAssetSolRespuesta >( ) ;
			respuestas.add( respuesta ) ;
			cuentaDeOperacion.setTblAssetSolRespuestas( respuestas ) ;
			em.merge( cuentaDeOperacion ) ;
			em.flush( ) ;
//			em.refresh( cuentaDeOperacion ) ;
			
			respuestas = usuarioDeOperacion.getTblAssetSolRespuestas( ) ;
			if( respuestas == null )
				respuestas = new ArrayList< TblAssetSolRespuesta >( ) ;
			respuestas.add( respuesta ) ;
			usuarioDeOperacion.setTblAssetSolRespuestas( respuestas ) ;
			em.merge( usuarioDeOperacion ) ;
			em.flush( ) ;
//			em.refresh( usuarioDeOperacion ) ;
			
			// VERIFICA QUE TODOAS LAS RESPUESTAS YA HAYAN SIDO DADAS COMO ACEPTADAS
			// cuentas hermanas de la cuenta de la solicitud
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Verifica que todas las respuestas hayan sido contestadas: " ) ;
			
			List< TblCuenta > cuentasDeTipoCuenta = getAllActiveBindCounts( cuentaDeSolicitud.getCveCuenta( ) ) ;
			
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Cuentas hermanas: " + cuentasDeTipoCuenta.size( ) ) ;
			
			List< TblCuenta > bindCounts = new ArrayList< TblCuenta >( ) ;
			
			// toma las respuestas a la solicitud
			respuestas = solicitud.getTblAssetSolRespuestas( ) ;
			
			System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Respuestas de solicitud: " + respuestas.size( ) ) ;
			
			boolean todoAutorizado = true ;
			
			// recorre las cuentas
			for( TblCuenta c : cuentasDeTipoCuenta )
			{
				System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Cuenta recorrida: " + c.getNombre( ) ) ;
				
				boolean cuentaYaAutorizo = false ;
				
				// verifica si ya autorizo la solicitud
				for( TblAssetSolRespuesta resp : respuestas )
				{
					// en caso de que coincida
					if( c.getCveCuenta( ) == resp.getTblCuenta( ).getCveCuenta( ) )
					{
						System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Ya autorizo " + cuentasDeTipoCuenta.size( ) ) ;
						
						// cambia la bandera
						cuentaYaAutorizo = true ;
						
						// quiebra el ciclo
						break ;
					}
				}
				
				// en caso e que la cuenta no haya autorizado
				if( ! cuentaYaAutorizo )
				{
					// cambia la bandera, puesto que falta una cuenta que autorice
					todoAutorizado = false ;
					
					// quiebra el cicle
					break ;
				}
			}
			
			// en caso de uqe ya este todo autorizado
			if( todoAutorizado )
			{
				System.out.println( "%%% MasterCardDAO-autorizarSolicitud: Todo autorizado!" ) ;
				
				// paquete en cuestion
				TblPaquete paq = tipoCuentaPaquete.getTblPaquete( ) ;
				
				// coloca el nuevo registro en TblCuentaPaquete
				TblCuentaPaquete cuentaPaquete = new TblCuentaPaquete( ) ;
				cuentaPaquete.setBandera( ( byte ) 1 ) ;
				cuentaPaquete.setFechaAlta( now ) ;
				cuentaPaquete.setStatus( ( byte ) 1 ) ;
				cuentaPaquete.setTblCuenta( cuentaDeSolicitud ) ;
				cuentaPaquete.setTblPaquete( paq ) ;
				
				// agrega
				em.persist( cuentaPaquete ) ;
				em.flush( ) ;
				em.refresh( cuentaPaquete ) ;
				
				// agrega la cuentaPaquete al paquete
				List< TblCuentaPaquete > cuentasPaquete = paq.getTblCuentaPaquetes( ) ;
				if( cuentasPaquete == null )
				{
					cuentasPaquete = new ArrayList< TblCuentaPaquete>( ) ;
					cuentasPaquete.add( cuentaPaquete ) ;
				}
				// en caso de que no
				else
					cuentasPaquete.add( cuentaPaquete ) ;
				
				// actualiza
				paq.setTblCuentaPaquetes( cuentasPaquete ) ;
				
				// refresca
				em.merge( paq ) ;
				em.flush( ) ;
//				em.refresh( paq ) ;
				
				// actualiza la cuenta
				List< TblCuentaPaquete > cps = cuentaDeSolicitud.getTblCuentaPaquetes( ) ;
				
				if( cps == null )
				{
					cps = new ArrayList< TblCuentaPaquete>( ) ;
					cps.add( cuentaPaquete ) ;
				}
				// en caso de que no
				else
					cps.add( cuentaPaquete ) ;
				
				// actualiza
				cuentaDeSolicitud.setTblCuentaPaquetes( cps ) ;
				
				// refresca
				em.merge( cuentaDeSolicitud ) ;
				em.flush( ) ;
//				em.refresh( cuentaDeSolicitud ) ;
				
				// modifica la bandera de tipoCuentaPaquete
				// cambia la bandera a 3
				tipoCuentaPaquete.setBandera( ( byte ) 3 ) ;
				
				em.merge( tipoCuentaPaquete ) ;
				em.flush( ) ;
//				em.refresh( tipoCuentaPaquete ) ;
				
				// modifica la solicitud a bandera 2
				solicitud.setBandera( ( byte ) 2 ) ;
				
				em.merge( solicitud ) ;
				em.flush( ) ;
//				em.refresh( solicitud ) ;
			}
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.ErrorRequestPackage" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
	}
	
	public static void noAutorizarSolicitud( int cveSolicitud , UserLogin user )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de numero invalido
		if( cveSolicitud < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.RequestIdInvalid" , cveSolicitud ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_REQUEST_ID_INVALID , 
					null ) ;
		
		// en caso de numero invalido
		if( user == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.CountIdInvalid" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_COUNT_ID_INVALID , 
					null ) ;
		
		// ping( 172 ) ;
		
		// encaso de que no sean nulos los modifica
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// realiza una solicitud
			TblAssetSolicitud solicitud = em.find( TblAssetSolicitud.class , new Integer( cveSolicitud ) ) ;
			
			// en caso de null
			if( solicitud == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.RequestIdNotExist" , cveSolicitud ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_REQUEST_ID_NOT_EXIST , 
						null ) ;
			
			// en caso de que la solicitud ya haya sido aceptada
			if( solicitud.getBandera( ) == 2 )
				// no hace nada
				return ;
			
			// realiza una cuenta
			TblCuenta cuentaDeOperacion = em.find( TblCuenta.class , new Integer( user.getActualCountId( ) ) ) ;
			
			// en caso de null
			if( cuentaDeOperacion == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.CountIdNotExist" , user.getActualCountId( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_COUNT_ID_NOT_EXIST , 
						null ) ;
			
			// realiza una solicitud
			TblUsuario usuarioDeOperacion = user.getTblUsuario( ) ;
			
			// en caso de null
			if( usuarioDeOperacion == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.autorizarpaquetes.UserIdNotExist" , user.getActualCountId( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PACKAGEAUTHORIZE_USER_ID_NOT_EXIST , 
						null ) ;
			
			// en caso de que si exista
			
			// cuenta que hace la solicitud
			TblCuenta cuentaDeSolicitud = solicitud.getTblCuenta( ) ;
			
			// toma el tipo de cuenta paquete
			TblTipoCuentaPaquete tipoCuentaPaquete = solicitud.getTblTipoCuentaPaquetes( ).get( 0 ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			// registra la respuesta
			TblAssetSolRespuesta respuesta = new TblAssetSolRespuesta( ) ;
			
			respuesta.setStatus( ( byte ) 1 ) ;
			respuesta.setFechaAlta( now ) ;
			respuesta.setAceptado( ( byte ) 2 ) ;
			respuesta.setTblAssetSolicitud( solicitud ) ;
			respuesta.setTblCuenta( cuentaDeOperacion ) ;
			respuesta.setTblUsuario( usuarioDeOperacion ) ;
			
			// registra
			em.persist( respuesta ) ;
			em.flush( ) ;
			em.refresh( respuesta ) ;
			
			// actualiza los assetSolicitud, las cuenta, y el usuario
			List< TblAssetSolRespuesta > respuestas = solicitud.getTblAssetSolRespuestas( ) ;
			if( respuestas == null )
				respuestas = new ArrayList< TblAssetSolRespuesta >( ) ;
			respuestas.add( respuesta ) ;
			solicitud.setTblAssetSolRespuestas( respuestas ) ;
			em.merge( solicitud ) ;
			em.flush( ) ;
//			em.refresh( solicitud ) ;
			
			respuestas = cuentaDeOperacion.getTblAssetSolRespuestas( ) ;
			if( respuestas == null )
				respuestas = new ArrayList< TblAssetSolRespuesta >( ) ;
			respuestas.add( respuesta ) ;
			cuentaDeOperacion.setTblAssetSolRespuestas( respuestas ) ;
			em.merge( cuentaDeOperacion ) ;
			em.flush( ) ;
//			em.refresh( cuentaDeOperacion ) ;
			
			respuestas = usuarioDeOperacion.getTblAssetSolRespuestas( ) ;
			if( respuestas == null )
				respuestas = new ArrayList< TblAssetSolRespuesta >( ) ;
			respuestas.add( respuesta ) ;
			usuarioDeOperacion.setTblAssetSolRespuestas( respuestas ) ;
			em.merge( usuarioDeOperacion ) ;
			em.flush( ) ;
//			em.refresh( usuarioDeOperacion ) ;
			
			// DADO QUE UNA CUENTA NO ACEPTO, ESA BASTA PARA QUE LA SOLICITUD SE HECHE PARA ATRAS, NO IMPORTANDO LA RESPUESTA DE LAS DEMAS CUENTAS
			// modifica la bandera de la solicitud a 3
			solicitud.setBandera( ( byte ) 3 ) ;
			
			em.merge( solicitud ) ;
			em.flush( ) ;
//			em.refresh( solicitud ) ;
			
			// cambia la bandera a 1
			tipoCuentaPaquete.setBandera( ( byte ) 1 ) ;
			
			em.merge( tipoCuentaPaquete ) ;
			em.flush( ) ;
//			em.refresh( tipoCuentaPaquete ) ;
			
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.ErrorRequestPackage" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
	}
	
	public static void BDMTitularasignaPaqueteACuenta( TblPaquete paquete , TblTipoCuentaPaquete tipoCuentaPaquete , TblCuenta cuenta )
                    throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            EntityTransaction et = em.getTransaction( ) ;
            
            try
            {
                et.begin( ) ;
                Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
                
                // coloca el nuevo registro en TblCuentaPaquete
                TblCuentaPaquete cuentaPaquete = new TblCuentaPaquete( ) ;
		cuentaPaquete.setBandera( ( byte ) 1 ) ;
		cuentaPaquete.setFechaAlta( now ) ;
		cuentaPaquete.setStatus( ( byte ) 1 ) ;
		cuentaPaquete.setTblCuenta( cuenta ) ;
		cuentaPaquete.setTblPaquete( paquete ) ;
                
                // agrega
                em.persist( cuentaPaquete ) ;
		em.flush( ) ;
		em.refresh( cuentaPaquete ) ;
                
                // agrega la cuentaPaquete al paquete
                List< TblCuentaPaquete > cuentasPaquete = paquete.getTblCuentaPaquetes( ) ;
		if( cuentasPaquete == null )
                {
                    cuentasPaquete = new ArrayList< TblCuentaPaquete>( ) ;
                    cuentasPaquete.add( cuentaPaquete ) ;
                }
		// en caso de que no
		else
                    cuentasPaquete.add( cuentaPaquete ) ;
                
                // actualiza
		paquete.setTblCuentaPaquetes( cuentasPaquete ) ;
				
		// refresca
		em.merge( paquete ) ;
		em.flush( ) ;
//		em.refresh( paquete ) ;
                
                // actualiza la cuenta
		List< TblCuentaPaquete > cps = cuenta.getTblCuentaPaquetes( ) ;
                
                if( cps == null )
                {
                    cps = new ArrayList< TblCuentaPaquete>( ) ;
                    cps.add( cuentaPaquete ) ;
                }
		// en caso de que no
		else
                    cps.add( cuentaPaquete ) ;
                
                // actualiza
                cuenta.setTblCuentaPaquetes( cps ) ;
				
		// refresca
		em.merge( cuenta ) ;
		em.flush( ) ;
//		em.refresh( cuenta ) ;
                
                // modifica la bandera de tipoCuentaPaquete
		// cambia la bandera a 3
		tipoCuentaPaquete.setBandera( ( byte ) 3 ) ;
				
		em.merge( tipoCuentaPaquete ) ;
		em.flush( ) ;
//		em.refresh( tipoCuentaPaquete ) ;
                
                em.flush( ) ;
			
		et.commit( ) ;
                
            }catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.ErrorRequestPackage" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
        }
	
	//////////////////// CAMPANIAS_PRODUCTO_ADQ
	
	
        public static List< TblCampaniaProductoAdq > getAllActiveCampaignProdAdqByCampaingId( int cveCampania )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try
            {
                Query q = em.createNamedQuery( "CampaignProductoAdq.FindAllActiveCampaignsProdAdqByCampaingId" ) ;
                q.setParameter( "cveCampania" , cveCampania ) ;
                List< TblCampaniaProductoAdq > l = q.getResultList( ) ;
                
                // en caso de null
			if( l == null )
				return new ArrayList< TblCampaniaProductoAdq >( ) ;
                        
                // en caso de que si haya resultados
		return l ;        
            }catch( Exception e )
		{
			return new ArrayList< TblCampaniaProductoAdq >( ) ;
		}            
        }
	
	
        
        //////////////////// CAMPANIAS_PRODUCTO_USURIO
	
	
        public static List< TblCampaniaProductoUsuario > getAllActiveCampaignProdUsrByCampaingId( int cveCampania )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try
            {
                Query q = em.createNamedQuery( "CampaignProductoUsuario.FindAllActiveCampaignsProdUsuarioByCampaingId" ) ;
                q.setParameter( "cveCampania" , cveCampania ) ;
                List< TblCampaniaProductoUsuario > l = q.getResultList( ) ;
                
                // en caso de null
			if( l == null )
				return new ArrayList< TblCampaniaProductoUsuario >( ) ;
                        
                // en caso de que si haya resultados
		return l ;        
            }catch( Exception e )
		{
			return new ArrayList< TblCampaniaProductoUsuario >( ) ;
		}            
        }
	
	                
        
	
	//////////////////// CAMPANIAS
	
	public static boolean existActiveCampaignByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return false ;
		
		// ping( 173 ) ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Campaign.FindActiveCampaignByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblCampania > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res.size( ) > 0 )
			// si existe
			return true ;
		
		// no existe
		return false ;
	}
	
	public static int addNewCampaign( 
								UserLogin userLogin ,
								String nombre , 
								Timestamp fechaIni , 
								Timestamp fechaFin , 
								int tipoCampania , 
								int[ ] producto , 
								int[ ] tipoProducto , 
								boolean multiplePartner , 
                                                                boolean autCountryM ,
								TblUsuario newUser , 
								String texto , 
								TblUsuario user1 , 
								int[ ] cuentaPaquetesCves , 
								int cveCuenta , 
								List< CampaniaProductoWraper > cpw , 
								java.math.BigDecimal gdvTotal , 
								int dc , 
								List< CampaniaProductoAdqWraper > cpaw ,
                                                                boolean estrategica ,
                                                                String comentarios ,
                                                                java.math.BigDecimal roi ,
                                                                int dMeses ,
                                                                java.math.BigDecimal revT ,
                                                                String inversion ,
                                                                String proposito ,
                                                                TblFlujoAutorizacion fluAut )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.EmptyNombre" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_EMTPY_NAME , 
					null ) ;
		
		// en caso de que ya exista una campania por el nombre dado
//		if( existActiveCampaignByName( nombre ) )
//		{
//			throw new MasterCardException( 
//					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.CampaignNameAlreadyExist" , nombre ) , 
//					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_NAME_ALREADY_EXIST , 
//					null ) ;
//		}
		
		// en caso de fechaIni nulo
		if( fechaIni == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.WrongIniDate" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_EMTPY_FECHA_INI , 
					null ) ;
		
		// en caso de fechaFin nulo
		if( fechaFin == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.WrongFinDate" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_EMTPY_FECHA_FIN , 
					null ) ;
		
		// en caso de tipoCampania nulo
		if( tipoCampania < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.NoCampaignType" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_EMTPY_CAMPAIGN_TYPE , 
					null ) ;
		
		// en caso de que si exista
		TblTipoCampania tblTipoCampania = findCampaignTypeById( tipoCampania ) ;
		
		// en caso de null
		if( tblTipoCampania == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.WrongCampaignTypeId" , tipoCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_EMTPY_CAMPAIGN_TYPE , 
					null ) ;
		
		// en caso de tipoCampania nulo
		if( newUser == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.NoUserInCharge" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_NO_USER_IN_CHARGE , 
					null ) ;
		
		// en caso de tipoCampania nulo
		if( user1 == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.NoUserToSetup" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_NO_USER_TO_SETUP , 
					null ) ;
		
		// en caso de tipoCampania nulo
		if( cveCuenta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.CveCuentaInvalido" , cveCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_COUNT_ID_INVALID , 
					null ) ;
		
		// busca la cuenta
		TblCuenta c = findCountById( cveCuenta ) ;
		
		// en caso de null
		if( c == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.CveCuentaNoExiste" , cveCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_COUNT_ID_NOT_EXIST , 
					null ) ;
		
		if( texto == null )
			texto = "" ;
		
                if( comentarios == null )
			comentarios = "" ;
                
                String roiS = "" ;
                
                if ( roi == null ){
                    roiS =   "0.0000000000"  ;
                }else
                {
                    roiS = roi.toString( ) ;
                    
                    if ( roiS.length( ) > 8 ){
                        roiS = roiS.substring(0, 8) ;
                    }
                    
                    roi  = new BigDecimal( roiS ) ;
                    
                }
                   
                String revS = "" ;
                java.math.BigDecimal resultado = new BigDecimal( "0.0000000000" ) ;
                
                if ( revT == null ){
                    revS =   "0.0000000000"  ;
                }else
                if( revT.toString( ).length() > 12 ){
                    revS = revT.toString( ) ;
                    
                    if( revS.length( ) > 12 )
                    {
                        revS = revS.substring(0, 12) ;
                    }
                    
                    revT  = new BigDecimal( revS ) ;
                }
                
		List< TblProducto > tblProductos = new ArrayList< TblProducto >( ) ;
		
		// en caso de que venga mayor a 1
		if( producto != null && producto.length > 0 )
		{
			// recorre
			for( int i : producto )
			{
				// en caso de todos los productos
				if( i == 0 )
				{
					tblProductos = getAllActiveProduct( ) ;
					
					// rompe el ciclo
					break ;
				}
				else
				{
					TblProducto tblProducto = findProductById( i ) ;
					
					// en caso de que no sea null
					if( tblProducto != null )
						// agrega
						tblProductos.add( tblProducto ) ;
				}
			}
		}
		
		List< TblTipoProducto > tblTipoProductos = new ArrayList< TblTipoProducto >( ) ;
		
		// en caso de que venga mayor a 1
		if( tipoProducto != null && tipoProducto.length > 0 )
		{
			// recorre
			for( int i : tipoProducto )
			{
				// en caso de que sea 0
				if( i == 0 )
				{
					// toma todos
					tblTipoProductos = getAllActiveProductTypes( ) ;
					
					// rompe ciclo
					break ;
				}
				// en caos de que no sea 0
				else
				{
					TblTipoProducto tblTipoProducto = findProductTypeById( i ) ;
					
					// en caso de que no sea null
					if( tblTipoProducto != null )
						// agrega
						tblTipoProductos.add( tblTipoProducto ) ;
				}
			}
		}
		
		if( cuentaPaquetesCves == null || cuentaPaquetesCves.length == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.NoPackage" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_NO_PACKAGES , 
					null ) ;
		
		// ping( 174 ) ;
		
		// encaso de que no sean nulos los modifica
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// realiza una campana
			TblCampania campania = new TblCampania( ) ;
			
			campania.setBandera( ( byte ) 3 ) ;
			campania.setBc( null ) ;
			campania.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			campania.setFechaFin( fechaFin ) ;
			campania.setFechaIni( fechaIni ) ;
			// si esta elegido coloca 1, sino coloca 2
			campania.setMultiplePartner( ( multiplePartner ) ? ( byte ) 1 : ( byte ) 2 ) ;
                        campania.setAutorizaCountryM( ( autCountryM ) ? ( byte ) 1 : ( byte ) 2 ) ;
			campania.setNombre( nombre ) ;
			campania.setStatus( ( byte ) 1 ) ;
			campania.setTexto( texto ) ;
			campania.setTblProducto( null ) ;
			campania.setTblProductos( tblProductos ) ;
			campania.setTblTipoProductos( tblTipoProductos ) ;
			campania.setTblTipoCampania( tblTipoCampania ) ;
			campania.setTblUsuario1( user1 ) ;
			campania.setTblUsuario2( newUser ) ;
			campania.setTblPaquetes( new ArrayList< TblPaquete >( ) ) ;
			campania.setTblCuenta( c ) ;
                        campania.setEstrategica( ( estrategica ) ? ( byte ) 1 : ( byte ) 2 ) ;
                        campania.setComentarios( comentarios ) ;
                        campania.setRoi( roi ) ;
                        campania.setRevenue( revT ) ;
                        campania.setProposito( proposito ) ;
                        campania.setInversion( inversion ) ;
                        campania.setGdvTotal( gdvTotal ) ;
                        campania.setResultado( resultado );
                        if( tipoCampania == 7 || tipoCampania == 2 )
                                {
                                    campania.setMeses( dMeses ) ;
                                }
			
			// coloca en base de datos
			em.persist( campania ) ;
			em.flush( ) ;
			em.refresh( campania ) ;
			
			// actualiza la cuenta
			c.getTblCampanias( ).add( campania ) ;
			em.merge( c ) ;
			em.flush( ) ;
//			em.refresh( c ) ;
			
			// paquetes
			List< TblPaquete > paquetes = new ArrayList< TblPaquete >( ) ;
			
//			System.out.println( "Tamanio de TblCuentaPaqueteCves: " + cuentaPaquetesCves.length ) ;
			
			// recorre los ids
			for( int cve : cuentaPaquetesCves )
			{
				// tom ael tipo de cuentapaquete
				TblCuentaPaquete cp = em.find( TblCuentaPaquete.class , new Integer( cve ) ) ;
				
//				System.out.println( "TblCuentaPaquete: " + cp ) ;
				
				// en caso de que sea null
				if( cp == null )
					continue ;
				
				TblPaquete paq = cp.getTblPaquete( ) ;
				// toma el paquete y lo agrega
//				paquetes.add( paq ) ;
				
				// coloca los paquetes
				campania.getTblPaquetes( ).add( paq ) ;
				
				// actualiza la campania
				em.persist( campania ) ;
				em.flush( ) ;
				em.refresh( campania ) ;
				
				// actualiza el paquete
				paq.getTblCampanias( ).add( campania ) ;
				
				em.merge( paq ) ;
				em.flush( ) ;
//				em.refresh( paq ) ;
				
				// convierte el tipocuentapaquete la bandera
				cp.setBandera( ( byte ) 2 ) ;
				
				em.merge( cp ) ;
				em.flush( ) ;
//				em.refresh( cp ) ;
			}
			
			// con el login
			newUser.getTblCampanias2( ).add( campania ) ;
			
			em.merge( newUser ) ;
			em.flush( ) ;
//			em.refresh( newUser ) ;
			
                        List<TblCampania> lcamp = new ArrayList<TblCampania>( ) ;
                        lcamp.add( campania ) ;
//			user1.getTblCampanias1( ).add( campania ) ;
			user1.setTblCampanias1( lcamp ) ;
                        
			em.merge( user1 ) ;
			em.flush( ) ;
//			em.refresh( user1 ) ;
			
			// actualiza los productos
			for( TblProducto p : tblProductos )
			{
				p.getTblCampanias2( ).add( campania ) ;
				
				em.merge( p ) ;
				em.flush( ) ;
//				em.refresh( p ) ;
			}
			
			// actualiza los productos
			for( TblTipoProducto p : tblTipoProductos )
			{
				p.getTblCampanias( ).add( campania ) ;
				
				em.merge( p ) ;
				em.flush( ) ;
//				em.refresh( p ) ;
			}
			
			// actualiza el tipocampania
			tblTipoCampania.getTblCampanias( ).add( campania ) ;
			
			em.merge( tblTipoCampania ) ;
			em.flush( ) ;
//			em.refresh( tblTipoCampania ) ;
			
			em.flush( ) ;
			
			// toma el tipo de campania y verifica si el nombre es 'Uso' o no
			if( ( tblTipoCampania.getNombre( ).equalsIgnoreCase( "Uso" ) ) ||
                            ( tblTipoCampania.getNombre( ).equalsIgnoreCase( "Retencion" ) ) ||
                            ( tblTipoCampania.getNombre( ).equalsIgnoreCase( "Activacion" ) ) )
			{
				// si coincide con esa palabra, entonces carga los datos en base de datos.
				// convierte gdvtotal en float
				try
				{
//					float gdvTotalF = Float.parseFloat( gdvTotal ) ;
					
					// actualiza el valor
					campania.setGdvTotal( gdvTotal ) ;
					campania.setMeses( dc ) ;
					
					em.persist( campania ) ;
					em.flush( ) ;
					em.refresh( campania ) ;
				}catch( Exception e )
				{
					e.printStackTrace( ) ;
					et.rollback( ) ;
					
					throw new MasterCardException( 
							MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.generarcampana.errors.Error" , e.getMessage( ) ) , 
							MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
							e ) ;
				}
				
				// recorre todos los cpw
				for( CampaniaProductoWraper cp : cpw )
				{
					// carga en base de datos
					// toma los dos arreglos
					java.math.BigDecimal[ ] gdvpms = cp.getGdvpmF( ) ;
					float[ ] rrs = cp.getRrF( ) ;
					
					java.math.BigDecimal atF = cp.getAtF( ) ;
					java.math.BigDecimal tpF = cp.getGdvtpF( ) ;
					float itF = cp.getItF( ) ;
					TblProducto productoAux = cp.getProducto( ) ;
					
					// crea el objeto de la tabla tblcampaniaproductousuario
					TblCampaniaProductoUsuario tcpu = new TblCampaniaProductoUsuario( ) ;
					
					tcpu.setAveraGetTicket( atF ) ;
					tcpu.setGdvTotalDelProducto( tpF ) ;
					tcpu.setIncrementalTransaction( itF ) ;
					tcpu.setTblCampania( campania ) ;
					tcpu.setTblProducto( productoAux ) ;
					
					// agrega a base de datos
					em.persist( tcpu ) ;
					em.flush( ) ;
					em.refresh( tcpu ) ;
					
					// agrega a la campania
					List< TblCampaniaProductoUsuario > tcpus = campania.getTblCampaniaProductoUsuarios( ) ;
					
					if( tcpus == null )
					{
						tcpus = new ArrayList< TblCampaniaProductoUsuario >( ) ;
						
						// agrega
						campania.setTblCampaniaProductoUsuarios( tcpus ) ;
						
						// agrega a base de datos
						em.persist( campania ) ;
						em.flush( ) ;
						em.refresh( campania ) ;
					}
					
					// agrega
					tcpus.add( tcpu ) ;
					
					// agrega a base de datos
					em.persist( tcpu ) ;
					em.flush( ) ;
					em.refresh( tcpu ) ;
					
					// agrega a la campania
					tcpus = productoAux.getTblCampaniaProductoUsuarios( ) ;
					
					if( tcpus == null )
					{
						tcpus = new ArrayList< TblCampaniaProductoUsuario >( ) ;
						
						// agrega
						productoAux.setTblCampaniaProductoUsuarios( tcpus ) ;
						
						// agrega a base de datos
						em.merge( productoAux ) ;
						em.flush( ) ;
//						em.refresh( productoAux ) ;
					}
					
					// recorre
					for( int i = 0 ; i < gdvpms.length ; i++ )
					{
						// crea el objeto de la tabla tblcampaniaproductousuario
						TblCampaniaMes tcm = new TblCampaniaMes( ) ;
						
						tcm.setTblCampaniaProductoUsuario( tcpu ) ;
						tcm.setGdvTotalMes( gdvpms[ i ] ) ;
						tcm.setMes( i + 1 ) ;
						tcm.setResponseRate( rrs[ i ] ) ;
						
						// agrega a base de datos
						em.persist( tcm ) ;
						em.flush( ) ;
						em.refresh( tcm ) ;
						
						List< TblCampaniaMes > tcms = tcpu.getTblCampaniaMeses( ) ;
						
						if( tcms == null )
						{
							tcms = new ArrayList< TblCampaniaMes >( ) ;
							
							tcpu.setTblCampaniaMeses( tcms ) ;
							
							// agrega a base de datos
							em.merge( tcpu ) ;
							em.flush( ) ;
//							em.refresh( tcpu ) ;
							
						}
						
						tcms.add( tcm ) ;
						
						tcpu.setTblCampaniaMeses( tcms ) ;
						
						// agrega a base de datos
						em.persist( tcpu ) ;
						em.flush( ) ;
						em.refresh( tcpu ) ;
					}// termina for para recorrer los gdvpms
				}// termina for para recorre lod cpw 
			}// termina ir para tipo campania de Uso
			// en caso de campania Adquisicion
			if( tblTipoCampania.getNombre( ).equalsIgnoreCase( "Adquisicion" ) )
			{
				// recorre los cpaw
				for( CampaniaProductoAdqWraper cpa : cpaw )
				{
					// toma el numero de meses
					int numberOfMounths = cpa.getNumberOfMonth( ) ;
					// toma el producto
					TblProducto prodTemp = findProductById( cpa.getCveProducto( ) ) ;
					
					// recorre numero de meses
					for( int iMonth = 1 ; iMonth <= numberOfMounths ; iMonth++ )
					{
						// por cada uno agrega un registor en la tabla correspondiente
						TblCampaniaProductoAdq adq = new TblCampaniaProductoAdq( ) ;
						
						adq.setMes( iMonth ) ;
						adq.setStatus( ( byte ) 1 ) ;
						adq.setTarjetas( cpa.getMes( iMonth ) ) ;
						adq.setTblCampania( campania ) ;
						adq.setTblProducto( prodTemp ) ;
                                                adq.setResultado( 0 ) ;
                                                adq.setRevenue( new BigDecimal( "0.0000000000" ) );
						
						// agrega a bd
						em.persist( adq ) ;
						em.flush( ) ;
						em.refresh( adq ) ;
						
						// actualiza campania y producto
						List< TblCampaniaProductoAdq > listAdq = campania.getTblCampaniaProductoAdqs( ) ;
						
						if( listAdq == null )
						{
							listAdq = new ArrayList< TblCampaniaProductoAdq >( ) ;
							
							campania.setTblCampaniaProductoAdqs( listAdq ) ;
                                                        campania.setMeses( dc ) ;
							
							em.persist( campania ) ;
							em.flush( ) ;
							em.refresh( campania ) ;
						}
						
						campania.getTblCampaniaProductoAdqs().add( adq ) ;                                                
						
						em.persist( campania ) ;
						em.flush( ) ;
						em.refresh( campania ) ;
						
						// actualiza campania y producto
						listAdq = prodTemp.getTblCampaniaProductoAdqs( ) ;
						
						if( listAdq == null )
						{
							listAdq = new ArrayList< TblCampaniaProductoAdq >( ) ;
							
							prodTemp.setTblCampaniaProductoAdqs( listAdq ) ;
							
							em.merge( prodTemp ) ;
							em.flush( ) ;
//							em.refresh( prodTemp ) ;
						}
						
						prodTemp.getTblCampaniaProductoAdqs().add( adq ) ;
						
						em.merge( prodTemp ) ;
						em.flush( ) ;
//						em.refresh( prodTemp ) ;
						
					}
				}
			}
			
			// lanza flujo de assets
			throwCampaign( userLogin , campania , fluAut , et ) ;
                        
                        // lanza notificacion
			NotificationUtil.throwNotificationTypeGenerateCampaign( campania , et , 0 ) ;
                        
			et.commit( ) ;
			
			return campania.getCveCampania( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.generarcampana.errors.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_PACKAGE_ERROR , 
					e ) ;
		}
	}
	
	public static List< TblCampania > findNotAuthorizedCampaignByUser( int cveUsuario )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre n	ulo
		if( cveUsuario < 1 )
			return new ArrayList< TblCampania >( ) ;
		
		try
		{
			// ping( 175 ) ;
			
			Query q = em.createNamedQuery( "Campaign.FindNotAuthorizedCampaignByUser" ) ;
			q.setParameter( "userId" , cveUsuario ) ;
			List< TblCampania > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l.size( ) == 0 )
				return new ArrayList< TblCampania >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}
	}
        
        public static List< TblCampania > findAuthorizedCampaignByCountry( int cvePais )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		try
		{
			// ping( 175 ) ;
			
			Query q = em.createNamedQuery( "Campaign.FindAuthorizedCampaignByCountry" ) ;
			q.setParameter( "paisId" , cvePais ) ;
			List< TblCampania > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l.size( ) == 0 )
				return new ArrayList< TblCampania >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace( );
			return new ArrayList< TblCampania >( ) ;
		}
	}
	
        public static List< TblCampania > FindAllAuthorizedCampaigns(  )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		try
		{
			// ping( 175 ) ;
			
			Query q = em.createNamedQuery( "Campaign.FindAllAuthorizedCampaigns" ) ;
			List< TblCampania > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l.size( ) == 0 )
				return new ArrayList< TblCampania >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
                    e.printStackTrace( );
			return new ArrayList< TblCampania >( ) ;
		}
	}
        
	public static List< TblCampania > findAllActivCampaigns( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 176 ) ;
			
			Query q = em.createNamedQuery( "Campaign.FindAllActiveCampaigns" ) ;
			List< TblCampania > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCampania >( ) ;
			
			for( TblCampania c : l )
				em.refresh( c ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}
	}
        
        public static List< TblCampania > findAllActivCampaignsByCountry( int cvePais )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 176 ) ;
			
			Query q = em.createNamedQuery( "Campaign.FindAllCampaignByCountry" ) ;
                        q.setParameter("paisId", cvePais);
			List< TblCampania > l = q.getResultList( ) ;
                        closeEntityManager( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCampania >( ) ;
			
						
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}
	}
	
        public static List< TblCampania > findAllActivCampaignsByCountAndFlag ( int cveCount )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
           
            try 
            {
                // ping( 177 ) ;
                
                        Query q = em.createNamedQuery( "Campaign.FindAllActiveCampaignsByCountAndFlag" ) ;
			q.setParameter( "cveCuenta" , cveCount ) ;
			List< TblCampania > l = q.getResultList( ) ;
                        
                        // en caso de que no haya resultados
                        if( l == null )
				return new ArrayList< TblCampania >( ) ;
			
			for( TblCampania c : l )
				em.refresh( c ) ;
			
			// en caso de que si haya resultados
			return l ;
            }catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}
        }
	
        public static List< TblCampania > findAllActivCampaignsByCount( int cveCount )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 177 ) ;
			
			Query q = em.createNamedQuery( "Campaign.FindAllActiveCampaignsByCount" ) ;
			q.setParameter( "cveCuenta" , cveCount ) ;
			List< TblCampania > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCampania >( ) ;
			
			for( TblCampania c : l )
				em.refresh( c ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}
	}
        
        public static List< TblDomestic > findAllActiveBps( )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try
            {
                Query q = em.createNamedQuery( "Domestic.findAllActiveBps" ) ;
                List< TblDomestic > l = q.getResultList( ) ;
                
                if ( l == null )
                    return new ArrayList< TblDomestic >( ) ;                              
                
                return l ;
            }catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.level.ErrorTryingGetAllActiveUsers" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_COUNTYPE_ERROR_GETTINT_ALL_ACTIVE_LEVELS , 
					e ) ;
		}
        }
        
        public static boolean addNewBps( TblCuenta cuenta , TblProducto producto , java.math.BigDecimal domesticBps , java.math.BigDecimal percentDoemstic , java.math.BigDecimal intlbps , java.math.BigDecimal cardbps )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
            EntityTransaction et = em.getTransaction( ) ;
            
            // en caso de que no exista.
		// crea el Objeto
		TblDomestic td = new TblDomestic( ) ;
                td.setTblCuenta(cuenta);
                td.setTblProducto(producto);
                td.setDomesticBps(domesticBps);
                td.setPercentDomestic(percentDoemstic);
		td.setStatus( ( byte ) 1 ) ;
                td.setIntlBps(intlbps);
                td.setCardBps(cardbps);
		
		try
		{
                        et.begin( ) ;
                        
			em.persist( td ) ;
			
			em.flush( ) ;
			em.refresh( td ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.tipocuenta.nuevo.dao.ErrorAddingBps" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_COUNTTYPE_ERROR , 
					e ) ;
		}
		
		return true ;
            
        }
        
        public static boolean existActiveBpsByCountAndProduct( int cuenta , int producto )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            Query q = em.createNamedQuery( "Domestic.findActiveBpsByCountAndProduct" ) ;
		q.setParameter( "cuenta" , cuenta ) ;
                q.setParameter( "producto" , producto ) ;
		List< TblDomestic > res = q.getResultList( ) ;
                
                // en caso de haber resultados
		if( res.size( ) < 1 )
			// si existe
			return false ;
                
                return true;                
        }
        
        public static List< TblDomestic > existActiveBpsByCountAndProductB( int cuenta , int producto )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            Query q = em.createNamedQuery( "Domestic.findActiveBpsByCountAndProduct" ) ;
		q.setParameter( "cuenta" , cuenta ) ;
                q.setParameter( "producto" , producto ) ;
		List< TblDomestic > res = q.getResultList( ) ;
                
                // en caso de haber resultados
		if( res == null )
			// si existe
			return new ArrayList< TblDomestic > ( ) ;
                
                return res;        
        }
	
	public static List< TblCampania > findAllActivCampaignsByOwner( int cveUsuario )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 178 ) ;
			
			Query q = em.createNamedQuery( "Campaign.FindAllActiveCampaignsByOwner" ) ;
			q.setParameter( "cveUsuario" , cveUsuario ) ;
			List< TblCampania > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCampania >( ) ;
			
			for( TblCampania c : l )
				em.refresh( c ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}
	}
	
	public static List< TblCampania > findAllActivCampaignsByResp( int cveUsuario )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 179 ) ;
			
			Query q = em.createNamedQuery( "Campaign.FindAllActiveCampaignsByResp" ) ;
			q.setParameter( "cveUsuario" , cveUsuario ) ;
			List< TblCampania > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCampania >( ) ;
			
			for( TblCampania c : l )
				em.refresh( c ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}
	}
        
        public static List< TblCampania > findAllActivCampaignsByRespAndCount( int cveUsuario, int cveCuenta )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{	
			Query q = em.createNamedQuery( "Campaign.FindAllActiveCampaignsByRespAndCount" ) ;
			q.setParameter( "cveUsuario" , cveUsuario ) ;
                        q.setParameter( "cveCuenta" , cveCuenta ) ;
			List< TblCampania > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblCampania >( ) ;
			
			for( TblCampania c : l )
				em.refresh( c ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblCampania >( ) ;
		}
	}
	
	public static boolean unauthorizeCampaign( int cveCampania )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveCampania < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignIdInvalid" , cveCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_INVALID , 
					null ) ;
		
//		// ping( 180 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// toma la campania
			TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
			
			// en caso de null
			if( campania == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignNotExist" , cveCampania ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
						null ) ;
			
			// cambia la bandera
			campania.setBandera( ( byte ) 2 ) ;
			
			// actualiza
			em.merge( campania ) ;
			em.flush( ) ;
//			em.refresh( campania ) ;
			
			// toma los cuentapaqute
			List< TblPaquete > paquetes = campania.getTblPaquetes( ) ;
			
			// recorre los paquetes
			for( TblPaquete paq : paquetes )
			{
				// toma el tblcuentapaquete
				List< TblCuentaPaquete > cuentaPaqs = paq.getTblCuentaPaquetes( ) ;
				
				TblCuentaPaquete cuentaPaq = null ;
				
				// toma el primero activo y en status 2 (en campania)
				for( TblCuentaPaquete cpa : cuentaPaqs )
					// en caos de que coincida
					if( cpa.getBandera( ) == 2 && cpa.getStatus( ) == 1 )
					{
						cuentaPaq = cpa ;
						
						break ;
					}
				
				// en caos de que no sea null
				if( cuentaPaq != null )
				{
					// actualiza bandera
					cuentaPaq.setBandera( ( byte ) 1 ) ;
					
					em.merge( cuentaPaq ) ;
					em.flush( ) ;
//					em.refresh( cuentaPaq ) ;
					
//					// borra el paquete de la campana
//					campania.getTblPaquetes( ).remove( paq ) ;
//					
//					em.persist( campania ) ;
//					em.flush( ) ;
//					em.refresh( campania ) ;
				}
			}
                        
			et.commit( ) ;
                        
                        // lanza notificacion
//			NotificationUtil.throwNotificationTypeRejectCampaign( campania , 0 ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static boolean authorizeCampaign( UserLogin user , int cveCampania , String bcName )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveCampania < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignIdInvalid" , cveCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_INVALID , 
					null ) ;
		
		// ping( 181 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// toma la campania
			TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
			
			// en caso de null
			if( campania == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignNotExist" , cveCampania ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
						null ) ;
			
			// cambia la bandera
			campania.setBandera( ( byte ) 1 ) ;
			campania.setBc( bcName ) ;
			
			// actualiza
			em.merge( campania ) ;
			em.flush( ) ;
//			em.refresh( campania ) ;
			
			// lanza flujo de assets
			
//                        throwCampaign( user , campania , et ) ;no lo lanza aqui, lo hace al crear una campaña
			
			// lanza notificacion
			NotificationUtil.throwNotificationTypeAuthorizeCampaign( MasterCardDAO.findCampaignById( cveCampania ) , et ) ;
			
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static boolean setBCOfCampaign( int cveCampania , String bcName )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveCampania < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignIdInvalid" , cveCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_INVALID , 
					null ) ;
		
		// ping( 182 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// toma la campania
			TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
			
			// en caso de null
			if( campania == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignNotExist" , cveCampania ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
						null ) ;
			
			// cambia la bandera
			campania.setBc( bcName ) ;
			
			// actualiza
			em.merge( campania ) ;
			em.flush( ) ;
//			em.refresh( campania ) ;
			
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static boolean cancelCampaign( int cveCampania , int cveUsuario, int ope )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveCampania < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignIdInvalid" , cveCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_INVALID , 
					null ) ;
		
//		// ping( 183 ) ;
		
		// toma la campania
		TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
		
		// en caso de null
		if( campania == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignNotExist" , cveCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
					null ) ;
		
		// en caso de nombre nulo
		if( cveUsuario < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.UserIdInvalid" , cveCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_INVALID , 
					null ) ;
		
//		// toma la campania
//		TblUsuario usuario = em.find( TblUsuario.class , new Integer( cveUsuario ) ) ;
//		
//		// en caso de null
//		if( usuario == null )
//			throw new MasterCardException( 
//					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.UserNotExist" , cveUsuario ) , 
//					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
//					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			campania.setBandera( ( byte ) 4 ) ;
			
			em.merge( campania ) ;
			em.flush( ) ;
//			em.refresh( campania ) ;
			
			// toma los paquetes
			List< TblPaquete > paquetes = campania.getTblPaquetes( ) ;
			
			// recorre los paquetes, puesto que los tiene que poner de nuevo disponibles para la cuenta
			for( TblPaquete paq : paquetes )
			{
                            
                            // Obtiene al ganador del paquete si es que lo hay
                            List< TblGanador > ganadors = getWinnerWithPackage( paq.getCvePaquete( ) ) ;
                            
                            if ( ganadors.size( ) > 0 )
                            {
                                for ( TblGanador g : ganadors )
                                {
                                    // borra registro de ganador
                                    em.remove( g ) ;                                    
                                    em.flush( ) ;
                                }
                                    
                            }
                            
				// para cada paquete obtiene el TblCuentaPaquete correspondiente
				TblCuentaPaquete tcp = null ;
				
				List< TblCuentaPaquete > tcps = paq.getTblCuentaPaquetes( ) ;
				
				// recorre los tblCuentaPaquete
				for( TblCuentaPaquete tcpPaq : tcps )
					// el primero que encuentre en estatus 1
					if( tcpPaq.getStatus( ) == 1 )
					{
						// guarda
						tcp = tcpPaq ;
						
						// quiebra ciclo
						break ;
					}
				
				// en caso de que tcp sea null
				if( tcp == null )
					// siguiente
					continue ;
				
				// si no, cambia la bandera
				tcp.setBandera( ( byte ) 1 ) ;
				
				em.merge( tcp ) ;
				em.flush( ) ;
//				em.refresh( tcp ) ;
			}
			
			// cancela tblPreimplementacion
			List< TblPreimplementacion > tblPreimplementacions = campania.getTblPreimplementacions( ) ;
			
			List< TblPreimplementacion > tblPreimplementacions2 = new ArrayList< TblPreimplementacion >( ) ;
			
			for( TblPreimplementacion tbl : tblPreimplementacions )
				tblPreimplementacions2.add( tbl ) ;
			
			campania.setTblPreimplementacions( new ArrayList< TblPreimplementacion >( ) ) ;
			em.merge( campania ) ;
			em.flush( ) ;
//			em.refresh( campania ) ;
			
			// en caso de que no sea null
			if( tblPreimplementacions != null && tblPreimplementacions2.size( ) > 0 )
			{
				// recorre
				for( TblPreimplementacion tblPreimplementacion : tblPreimplementacions2 )
				{
					// toma las tareas
					List< TblTareaPreimplementacion > tblTareaPreimplementacions = tblPreimplementacion.getTblTareaPreimplementacions( ) ;
					
					List< TblTareaPreimplementacion > tblTareaPreimplementacions2 = new ArrayList< TblTareaPreimplementacion >( ) ;
					
					for( TblTareaPreimplementacion tbl : tblTareaPreimplementacions )
						tblTareaPreimplementacions2.add( tbl ) ;
					
					tblPreimplementacion.setTblTareaPreimplementacions( new ArrayList<TblTareaPreimplementacion>( ) ) ;
					em.refresh( tblPreimplementacion ) ;
					em.flush( ) ;
					em.refresh( tblPreimplementacion ) ;
					
					// recorre todas las tareas
					for( TblTareaPreimplementacion tblTareaPreimplementacion : tblTareaPreimplementacions2 )
					{
						// los borra del asset
						TblAsset asset = tblTareaPreimplementacion.getTblAsset( ) ;
						
						asset.getTblTareaPreimplementacions( ).remove( tblTareaPreimplementacion ) ;
						em.merge( asset ) ;
						em.flush( ) ;
//						em.refresh( asset ) ;
						
						// borra de la tarea
						TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
						tarea.getTblTareaPreimplementacions( ).remove( tblTareaPreimplementacion ) ;
						em.merge( tarea ) ;
						em.flush( ) ;
//						em.refresh( tarea ) ;
						
//						tblPreimplementacion.getTblTareaPreimplementacions( ).remove( tblTareaPreimplementacion ) ;
//						em.persist( tblPreimplementacion ) ;
//						em.flush( ) ;
//						em.refresh( tblPreimplementacion ) ;
//						
						// borra la tareapreimplementacion
						em.remove( tblTareaPreimplementacion ) ;
						em.flush( ) ;
					}
					
//					// borra del tblPreimplementacion
//					tblPreimplementacion.getTblTareaPreimplementacions( ).removeAll( tblTareaPreimplementacions ) ;
//					em.persist( tblPreimplementacion ) ;
//					em.flush( ) ;
//					em.refresh( tblPreimplementacion ) ;
					
					// borra de los assets
					List< TblAsset > assets = tblPreimplementacion.getTblAssets( ) ;
					
					List< TblAsset > assets2 = new ArrayList< TblAsset >( ) ;
					
					for( TblAsset a : assets )
						assets2.add( a ) ;
					
					tblPreimplementacion.setTblAssets( new ArrayList< TblAsset >( ) ) ;
					
					em.merge( tblPreimplementacion ) ;
					em.flush( ) ;
//					em.refresh( tblPreimplementacion ) ;
					
					for( TblAsset asset : assets2 )
					{
						// quita
						asset.getTblPreimplementacions( ).remove( tblPreimplementacion ) ;
						em.merge( asset ) ;
						em.flush( ) ;
//						em.refresh( asset ) ;
					}
					
//					// borra de la campania
//					campania.getTblPreimplementacions( ).remove( tblPreimplementacion ) ;
//					em.persist( campania ) ;
//					em.flush( ) ;
//					em.refresh( campania ) ;
					
					// borra la campania
					tblPreimplementacion.setTblCampania( null ) ;
					em.merge( tblPreimplementacion ) ;
					em.flush( ) ;
//					em.refresh( tblPreimplementacion ) ;
					
					// borra del flujo
					TblFlujo flujo = tblPreimplementacion.getTblFlujo( ) ;
					flujo.getTblPreimplementacions( ).remove( tblPreimplementacion ) ;
					em.merge( flujo ) ;
					em.flush( ) ;
//					em.refresh( flujo ) ;
					
					// borra tblPreimplementacion
					em.remove( tblPreimplementacion ) ;
					em.flush( ) ;
				}
			}
                        
                        NotificationUtil.throwNotificationTypeRejectCampaign( campania , ope , et ) ;
                        
			et.commit( ) ;
			                        
                        
			return true ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorCancelingCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
		
	}
	
	public static boolean dropBCOfCampaign( int cveCampania )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveCampania < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignIdInvalid" , cveCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_INVALID , 
					null ) ;
		
		// ping( 184 ) ;
		
		// toma la campania
		TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
		
		// en caso de null
		if( campania == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignNotExist" , cveCampania ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			campania.setBc( null ) ;
			
			em.merge( campania ) ;
			em.flush( ) ;
//			em.refresh( campania ) ;
			
			et.commit( ) ;
			
			return true ;
			
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorCancelingCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
		
	}
	
	public static TblCampania findCampaignById( int cveCampania )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveCampania < 1 )
			return null ;
		
		try
		{
			// ping( 185 ) ;
			
			// toma la campania
			TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
			
			return campania ;
		}catch( Exception e )
		{
			return null ;
		}
	}
	
	public static List< TblCampania > findActiveCampaignByName( String name )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( name == null || name.trim( ).length( ) == 0 )
			// regresa que no existe
			return new ArrayList< TblCampania >( ) ;
		
		// ping( 186 ) ;
		
		// verifica si ya existe
		Query q = em.createNamedQuery( "Campaign.FindActiveCampaignByName" ) ;
		q.setParameter( "nombre" , name ) ;
		List< TblCampania > res = q.getResultList( ) ;
		
		// en caso de haber resultados
		if( res == null )
			// si existe
			return new ArrayList< TblCampania >( ) ;
		
		// no existe
		return res ;
	}
	
	
	
	
	
	
	
	
	
	
	
	//////////////////// FORMAS
	
	public static List< TblForma > getAllActiveFormas( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 187 ) ;
			
			Query q = em.createNamedQuery( "Forms.FindAllActiveForm" ) ;
			List< TblForma > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblForma >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblForma >( ) ;
		}
	}
	
	public static List< TblTarea > getAllActiveFormasInFlow( int cveFlujo )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 188 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllActiveWorkInFlow" ) ;
			q.setParameter( "cveFlujo" , new Integer( cveFlujo ) ) ;
			List< TblTarea > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblTarea >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTarea >( ) ;
		}
	}
        public static List< TblTarea > TareasActivasDeMicroFlujo(  )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			
			Query q = em.createNamedQuery( "Tareas.TareasActivasDeMicroFlujo" ) ;
			List< TblTarea > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblTarea >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTarea >( ) ;
		}
	}       
	
        
        public static int addNewForm( String nombre , String descripcion , List< MultipleDataTO > salidas , String fileName )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.NombreEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de descripcion nula
		if( descripcion == null || descripcion.trim( ).length( ) == 0 )
			descripcion = "" ;
		
		if( salidas == null || salidas.size( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.SalidasEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		// ping( 189 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			// toma la campania
			TblForma forma = new TblForma( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			forma.setDescripcion( descripcion ) ;
			forma.setNombre( nombre ) ;
			forma.setFechaAlta( now ) ;
			forma.setArchivoForma( "" ) ;
			forma.setNombre( nombre ) ;
			forma.setStatus( ( byte ) 1 ) ;
			forma.setInitClass( "" ) ;
			forma.setPreviousClass( "" ) ;
			forma.setPostClass( "" ) ;
			
			// agrega
			em.persist( forma ) ;
			em.flush( ) ;
			em.refresh( forma ) ;
			
			// agrega las salidas
			for( MultipleDataTO salida : salidas )
			{
				// crea la salida
				TblFormaSalida formaSalida = new TblFormaSalida( ) ;
				
				formaSalida.setDescripcion( salida.getString01( ) ) ;
				formaSalida.setFechaAlta( now ) ;
				formaSalida.setNombre( salida.getString00( ) ) ;
				formaSalida.setStatus( ( byte ) 1 ) ;
				formaSalida.setTblForma( forma ) ;
				
				// agrega
				em.persist( formaSalida ) ;
				em.flush( ) ;
				em.refresh( formaSalida ) ;
				
				// actualiza la forma
				forma.getTblFormaSalidas( ).add( formaSalida ) ;
			}
			
			// carga la forma
			em.persist( forma ) ;
			em.flush( ) ;
			em.refresh( forma ) ;

			// manda todo a la base de datos
			et.commit( ) ;
			
			em.refresh( forma ) ;
			
			// coloca el nombre de la forma
			// nombre d ela forma
			String formaArchivoNombre = MCUtil.extractFormaFileName( forma.getCveForma( ) , fileName ) ;
			
			// inicia transaccion
			et.begin( ) ;
			// actualiza nombre
			forma.setArchivoForma( formaArchivoNombre ) ;
			em.persist( forma ) ;
			em.flush( ) ;
			em.refresh( forma ) ;
			
			// manda todo a la base de datos
			et.commit( ) ;
			
			return forma.getCveForma( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static int editForm( int cveForma , String nombre , String descripcion , List< MultipleDataTO > salidas , String fileName )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveForma < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.CveFormaWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// ping( 190 ) ;
		
		// busca la forma
		TblForma forma = em.find( TblForma.class , new Integer( cveForma ) ) ;
		
		// en caso de nula
		if( forma == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.FormaNotExist" , cveForma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		// en caso de nombre nulo
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.NombreEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de descripcion nula
		if( descripcion == null || descripcion.trim( ).length( ) == 0 )
			descripcion = "" ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			forma.setDescripcion( descripcion ) ;
			forma.setNombre( nombre ) ;
//			forma.setFechaAlta( now ) ;
//			forma.setArchivoForma( "" ) ;
			forma.setNombre( nombre ) ;
			forma.setStatus( ( byte ) 1 ) ;
			
			// agrega
			em.merge( forma ) ;
			em.flush( ) ;
//			em.refresh( forma ) ;
			
			if( salidas != null )
			{
				// agrega las salidas
				for( MultipleDataTO salida : salidas )
				{
					// crea la salida
					TblFormaSalida formaSalida = new TblFormaSalida( ) ;
					
					formaSalida.setDescripcion( salida.getString01( ) ) ;
					formaSalida.setFechaAlta( now ) ;
					formaSalida.setNombre( salida.getString00( ) ) ;
					formaSalida.setStatus( ( byte ) 1 ) ;
					formaSalida.setTblForma( forma ) ;
					
					// agrega
					em.persist( formaSalida ) ;
					em.flush( ) ;
					em.refresh( formaSalida ) ;
					
					// actualiza la forma
					forma.getTblFormaSalidas( ).add( formaSalida ) ;
				}
			
				// carga la forma
				em.merge( forma ) ;
				em.flush( ) ;
//				em.refresh( forma ) ;
			}
			// manda todo a la base de datos
			et.commit( ) ;
			
			em.refresh( forma ) ;
			
			// en caso de que no sea null
			if( fileName != null )
			{
				// coloca el nombre de la forma
				// nombre d ela forma
				String formaArchivoNombre = MCUtil.extractFormaFileName( forma.getCveForma( ) , fileName ) ;
				
				// inicia transaccion
				et.begin( ) ;
				// actualiza nombre
				forma.setArchivoForma( formaArchivoNombre ) ;
				em.merge( forma ) ;
				em.flush( ) ;
//				em.refresh( forma ) ;
				
				// manda todo a la base de datos
				et.commit( ) ;
			}
			
			return forma.getCveForma( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	/*
         func Cesar
         */
	public static boolean removeFileFromMaterial ( int cveMaterial )
                throws
                        MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            TblMaterialAsset material = em.find( TblMaterialAsset.class , new Integer( cveMaterial ) ) ;
            EntityTransaction et = em.getTransaction( ) ;
            
            try
            {
                et.begin( ) ;
		em.remove( material ) ;
		et.commit( ) ;
			
		return true ;
            }catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
        }
        
        public static boolean removeFileFromForm( int cveForma )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveForma < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.CveFormaWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// ping( 191 ) ;
		
		// busca la forma
		TblForma forma = em.find( TblForma.class , new Integer( cveForma ) ) ;
		
		// en caso de nula
		if( forma == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.FormaNotExist" , cveForma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			forma.setArchivoForma( "" ) ;
			
			// agrega
			em.merge( forma ) ;
			em.flush( ) ;
//			em.refresh( forma ) ;
			
			// manda todo a la base de datos
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static TblForma findFormaById( int cveForma )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveForma < 1 )
			return null ;
		
		// ping( 192 ) ;
		
		// obtiene el registro
		TblForma tc = em.find( TblForma.class , new Integer( cveForma ) ) ;
		
		return tc ;
	}
	
	public static List< TblFormaAlerta > getAllActiveFormaAlertaWithTareaAndExit( int cveTarea , int cveSalida )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 193 ) ;
			
			Query q = em.createNamedQuery( "Tareas.HowManyAlertsHaveWorkExit" ) ;
			q.setParameter( "cveTarea" , new Integer( cveTarea ) ) ;
			q.setParameter( "cveSalida" , new Integer( cveSalida ) ) ;
			
			List res = q.getResultList( ) ;
			
			if( res == null )
				return new ArrayList< TblFormaAlerta >( ) ;
			else
				return res ;
			
		}catch( Exception e )
		{
			return new ArrayList< TblFormaAlerta >( ) ;
		}
	}
	
	public static boolean removeExitFromForm( int cveForma , int cveSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveForma < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.CveFormaWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de nombre nulo
		if( cveSalida < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.CveSalidaWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// ping( 194 ) ;
		
		// busca la forma
		TblForma forma = em.find( TblForma.class , new Integer( cveForma ) ) ;
		
		// en caso de nula
		if( forma == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.FormaNotExist" , cveForma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			// toma las salidas
			List< TblFormaSalida > salidas = forma.getTblFormaSalidas( ) ;
			
			// salidas resultado
			List< TblFormaSalida > salidasRes = new ArrayList< TblFormaSalida >( ) ;
			
			// recorre las salidas
			for( TblFormaSalida sal : salidas )
			{
				// en caso de que coincida
				if( sal.getCveSalida( ) == cveSalida )
				{					
					sal.setStatus( ( byte ) 0 ) ;
					
					// actualiza
					em.merge( sal ) ;
					em.flush( ) ;
//					em.refresh( sal ) ;
					
					// es la unica
					break ;
				}
			}
			
			// manda todo a la base de datos
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static boolean removeForm( int cveForma )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveForma < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.CveFormaWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// ping( 195 ) ;
		
		// busca la forma
		TblForma forma = em.find( TblForma.class , new Integer( cveForma ) ) ;
		
		// en caso de nula
		if( forma == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.forms.add.errors.FormaNotExist" , cveForma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FORMS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			forma.setStatus( ( byte ) 0 ) ;
			
			em.merge( forma ) ;
			em.flush( ) ;
//			em.refresh( forma ) ;
			
			// manda todo a la base de datos
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static boolean existActiveExitNameInForm( int cveForma , String nombreSalida )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			boolean res = false ;
			
			// ping(196 ) ;
			
			Query q = em.createNamedQuery( "Forms.FindAllActiveExitWithNameInForm" ) ;
			q.setParameter( "cveForma" , new Integer( cveForma ) ) ;
			q.setParameter( "nombre" , nombreSalida ) ;
			List< TblFormaSalida > results = q.getResultList( ) ;
			
			// en caso de que si haya resultados
			if( results != null && results.size( ) > 0 )
				res = true ;
			
			return res ;
		}catch( Exception e )
		{
			return false ;
		}
	}
	
	public static boolean existInactiveExitNameInForm( int cveForma , String nombreSalida )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			boolean res = false ;
			
			// ping( 197 ) ;
			
			Query q = em.createNamedQuery( "Forms.FindAllInactiveExitWithNameInForm" ) ;
			q.setParameter( "cveForma" , new Integer( cveForma ) ) ;
			q.setParameter( "nombre" , nombreSalida ) ;
			List< TblFormaSalida > results = q.getResultList( ) ;
			
			// en caso de que si haya resultados
			if( results != null && results.size( ) > 0 )
				res = true ;
			
			return res ;
		}catch( Exception e )
		{
			return false ;
		}
	}
	
	public static List< TblFormaSalida > getAllActiveExitNameInForm( int cveForma , String nombreSalida )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 198 ) ;
			
			Query q = em.createNamedQuery( "Forms.FindAllActiveExitWithNameInForm" ) ;
			q.setParameter( "cveForma" , new Integer( cveForma ) ) ;
			q.setParameter( "nombre" , nombreSalida ) ;
			List< TblFormaSalida > results = q.getResultList( ) ;
			
			// en caso de que si haya resultados
			if( results == null || results.size( ) == 0 )
				return new ArrayList< TblFormaSalida >( ) ;
			
			for( TblFormaSalida s : results )
				em.refresh( s ) ;
			
			return results ;
		}catch( Exception e )
		{
			return new ArrayList< TblFormaSalida >( ) ;
		}
	}
	
	public static List< TblFormaSalida > getAllInactiveExitNameInForm( int cveForma , String nombreSalida )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 198 ) ;
			
			Query q = em.createNamedQuery( "Forms.FindAllInactiveExitWithNameInForm" ) ;
			q.setParameter( "cveForma" , new Integer( cveForma ) ) ;
			q.setParameter( "nombre" , nombreSalida ) ;
			List< TblFormaSalida > results = q.getResultList( ) ;
			
			// en caso de que si haya resultados
			if( results == null || results.size( ) == 0 )
				return new ArrayList< TblFormaSalida >( ) ;
			
			for( TblFormaSalida s : results )
				em.refresh( s ) ;
			
			return results ;
		}catch( Exception e )
		{
			return new ArrayList< TblFormaSalida >( ) ;
		}
	}
	
	
	
	
	
	
	
	
	
	

	
	
	//////////////////// ALERTAS
	
	public static List< TblAlerta > getAllActiveAlertas( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 199 ) ;
			
			Query q = em.createNamedQuery( "Alerts.FindAllActiveAlert" ) ;
			List< TblAlerta > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblAlerta >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblAlerta >( ) ;
		}
	}
	
	public static boolean addNewAlert( String nombre , String descripcion , String texto )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alerts.add.errors.NombreEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_ALERTS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de nombre nulo
		if( texto == null || texto.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alerts.add.errors.TextoEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_ALERTS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de descripcion nula
		if( descripcion == null || descripcion.trim( ).length( ) == 0 )
			descripcion = "" ;
		
		// ping( 200 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			// toma la campania
			TblAlerta alerta = new TblAlerta( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			alerta.setDescripcion( descripcion ) ;
			alerta.setNombre( nombre ) ;
			alerta.setFechaAlta( now ) ;
			alerta.setTexto( texto ) ;
			alerta.setStatus( ( byte ) 1 ) ;
			
			// agrega
			em.persist( alerta ) ;
			em.flush( ) ;
			em.refresh( alerta ) ;
			
			// manda todo a la base de datos
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static boolean editAlert( int cveAlerta , String nombre , String descripcion , String texto )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alerts.add.errors.CveAlertaWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_ALERTS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// ping( 201 ) ;
		
		// busca la forma
		TblAlerta alerta = em.find( TblAlerta.class , new Integer( cveAlerta ) ) ;
		
		// en caso de nula
		if( alerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alerts.add.errors.AlertaNotExist" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_ALERTS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		// en caso de nombre nulo
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alerts.add.errors.NombreEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_ALERTS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de descripcion nula
		if( descripcion == null || descripcion.trim( ).length( ) == 0 )
			descripcion = "" ;
		
		if( texto == null || texto.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alerts.add.errors.TextoEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_ALERTS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			alerta.setDescripcion( descripcion ) ;
			alerta.setNombre( nombre ) ;
			alerta.setTexto( texto ) ;
			
			// agrega
			em.merge( alerta ) ;
			em.flush( ) ;
//			em.refresh( alerta ) ;
			
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	public static TblAlerta findAlertById( int cveAlerta )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveAlerta < 1 )
			return null ;
		
		// ping( 202 ) ;
		
		// obtiene el registro
		TblAlerta tc = em.find( TblAlerta.class , new Integer( cveAlerta ) ) ;
		
		return tc ;
	}	
	
	public static boolean removeAlert( int cveAlerta )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alerts.add.errors.CveAlertaWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_ALERTS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// ping( 203 ) ;
		
		// busca la forma
		TblAlerta alerta = em.find( TblAlerta.class , new Integer( cveAlerta ) ) ;
		
		// en caso de nula
		if( alerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alerts.add.errors.AlertaNotExist" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_ALERTS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			alerta.setStatus( ( byte ) 0 ) ;
			
			em.merge( alerta ) ;
			em.flush( ) ;
//			em.refresh( alerta ) ;
			
			// manda todo a la base de datos
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.ErrorChangeStatusOnCampaign" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_CHANGE_STATUS_ERROR , 
					e ) ;
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	

	
	
	//////////////////// FLUJOS
	
        public static List< TblFlujoAutorizacion > getAllFlujosAut( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{	
			Query q = em.createNamedQuery( "FlowsAut.FindAllActiveFlows" ) ;
			List< TblFlujoAutorizacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujoAutorizacion >( );
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujoAutorizacion >( ) ;
		}
	}
        
        public static boolean deleteFlujosAut( int cve )
                throws Exception
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            EntityTransaction et = em.getTransaction( ) ;
            try
            {
                
                et.begin( ) ;
                TblFlujoAutorizacion tc = em.find( TblFlujoAutorizacion.class , new Integer( cve ) ) ;
                tc.setStatus( 2 ) ;			
                em.merge( tc ) ;
                em.flush( ) ;
                et.commit( ) ;
            }catch( Exception e )
		{
                    et.rollback( ) ;
                    return false ;
		}
            
            return true;
	}
        
        public static boolean updateFlujosAut( int cve , String nombre , int prioridad )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            EntityTransaction et = em.getTransaction( ) ;
            try
            {
                et.begin( ) ;
                TblFlujoAutorizacion tc = em.find( TblFlujoAutorizacion.class , new Integer( cve ) ) ;
                tc.setNombre( nombre ) ;			
                tc.setPrioridad( prioridad ) ;			
                em.merge( tc ) ;
                em.flush( ) ;
                et.commit( ) ;
            }catch( Exception e )
            {
                et.rollback();
                return false ;
            }            
            return true;
	}
        
        public static TblFlujoAutorizacion getFlujosAutById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            TblFlujoAutorizacion tc = em.find( TblFlujoAutorizacion.class , new Integer( cve ) ) ;
            return tc;
	}
        
        public static boolean getFlowByPriority( int prioridad )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            boolean res = false ;
            try
		{	
			Query q = em.createNamedQuery( "FlowsAut.FindAllActiveFlowsByPriority" ) ;
                        q.setParameter( "cve" , prioridad ) ;
			List< TblFlujoAutorizacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l.isEmpty( ) )
				return res ;
			
			// en caso de que si haya resultados
			return res = true ;
		}catch( Exception e )
		{
			return res ;
		}
        }
        public static List< TblFlujoAutorizacion > getFlowByPriority2( int prioridad )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            try
		{	
			Query q = em.createNamedQuery( "FlowsAut.FindAllActiveFlowsByPriority" ) ;
                        q.setParameter( "cve" , prioridad ) ;
			List< TblFlujoAutorizacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l.isEmpty( ) )
				return new ArrayList< TblFlujoAutorizacion >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujoAutorizacion >( ) ;
		}
        }
        
        public static boolean removeAllFlujosAut( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            Query q = em.createNamedQuery( "FlowsAut.FindAllActiveFlowsRolsByFlow" ) ;
            q.setParameter( "cveFlujo" , cve ) ;
            List< TblAutorizacionesRoles > l = q.getResultList( ) ;
            if(l != null){
                int count = l.size();
                if(count>0){
                    for(int i = 0; i<count; i++){
                        EntityTransaction et = em.getTransaction( ) ;
                        et.begin( ) ;
                        TblAutorizacionesRoles tc = l.get(i);		
                        em.remove( tc ) ;
                        em.flush( ) ;
                        et.commit( ) ;
                    }
                }
            }
            return true;
	}
        
        public static List<TblAutorizacionesRoles> getRolesAutById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            Query q = em.createNamedQuery( "FlowsAut.FindAllActiveFlowsRolsByFlow" ) ;
            q.setParameter( "cveFlujo" , cve ) ;
            List< TblAutorizacionesRoles > roles = q.getResultList( ) ;
            return roles;
	}
        
        public static String addFlujosAut( String nombre , int prioridad )
	{	
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                    EntityTransaction et = em.getTransaction( ) ;
                    et.begin( ) ;
                    TblFlujoAutorizacion tc = new TblFlujoAutorizacion();
                    tc.setNombre( nombre ) ;
                    tc.setPrioridad( prioridad ) ;				
                    tc.setStatus( 1 ) ;				
                    em.merge( tc ) ;
                    em.flush( ) ;
                    et.commit( ) ;
                    String val = "";
                    Query q = em.createNativeQuery("select cve_flujo_autorizaciones from tbl_flujo_autorizaciones where cve_flujo_autorizaciones=(select max(cve_flujo_autorizaciones) from tbl_flujo_autorizaciones);");	
                    List max = q.getResultList();
                    if(max.get(0).toString()=="null"){
                        val = "1";
                    }else{                    
                        val = max.get(0).toString();
                    }
                    val = val.replace( "[" , "" ) ;
                    val = val.replace( "]" , "" ) ;
                    return val;
	}
        
        public static boolean addFlujosAutRol( int rol , int orden , int cveFlujo )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                    EntityTransaction et = em.getTransaction( ) ;
                    
                    TblFlujoAutorizacion flujo = em.find( TblFlujoAutorizacion.class , new Integer( cveFlujo ) ) ;
                    
                    TblRole rolT = em.find( TblRole.class , new Integer( rol ) ) ;
                    
                    et.begin( ) ;
                    TblAutorizacionesRoles tc = new TblAutorizacionesRoles();
                    tc.setOrden( orden ) ;
                    tc.setTblFlujo( flujo ) ;				
                    tc.setTblRoles( rolT ) ;				
                    em.merge( tc ) ;
                    em.flush( ) ;
                    et.commit( ) ;
            return true ;
	}
        
	public static List< TblFlujo > getAllActivePreImplementationFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 204 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllActivePreImplementationFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllInactivePreImplementationFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 205 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllInactivePreImplementationFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllPreImplementationFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 206 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllPreImplementationFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllActiveImplementationFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 207 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllActiveImplementationFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllInactiveImplementationFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 208 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllInactiveImplementationFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllImplementationFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 209 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllImplementationFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllActiveCampaignFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 210 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllActiveCampaignFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllInactiveCampaignFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 211 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllInactiveCampaignFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllCampaignFlows( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 212 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllCampaignFlows" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static List< TblFlujo > getAllActiveFlujos( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 213 ) ;
			
			Query q = em.createNamedQuery( "Flows.FindAllActiveFlow" ) ;
			List< TblFlujo > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFlujo >( ) ;
			
			// recorre
			for( TblFlujo f : l )
				em.refresh( f ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFlujo >( ) ;
		}
	}
	
	public static boolean addNewFlujo( String nombre , String descripcion , int tipo )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.NombreEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de nombre nulo
		if( tipo < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.TipoEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de descripcion nula
		if( descripcion == null || descripcion.trim( ).length( ) == 0 )
			descripcion = "" ;
		
		// ping( 214 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			// toma la campania
			TblFlujo flujo = new TblFlujo( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			flujo.setDescripcion( descripcion ) ;
			flujo.setNombre( nombre ) ;
			flujo.setFechaAlta( now ) ;
			flujo.setTipo( ( byte ) tipo ) ;
			flujo.setStatus( ( byte ) 1 ) ;
			
			// agrega
			em.persist( flujo ) ;
			em.flush( ) ;
			em.refresh( flujo ) ;
			
			// manda todo a la base de datos
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.ErrorChangeStatusOnFlow" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_ADDING_FLOW , 
					e ) ;
		}
	}
	
	public static boolean editFlujo( int cveFlujo , String nombre , String descripcion , int tipo )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveFlujo < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.CveFlujoWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de nombre nulo
		if( nombre == null || nombre.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.NombreEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// en caso de descripcion nula
		if( descripcion == null || descripcion.trim( ).length( ) == 0 )
			descripcion = "" ;
		
		if( tipo < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.TipoEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		// ping( 215 ) ;
		
		// busca la forma
		TblFlujo flujo = em.find( TblFlujo.class , new Integer( cveFlujo ) ) ;
		
		// en caso de nula
		if( flujo == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.FlujoNotExist" , cveFlujo ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			flujo.setDescripcion( descripcion ) ;
			flujo.setNombre( nombre ) ;
			flujo.setTipo( ( byte ) tipo ) ;
			
			// agrega
			em.merge( flujo ) ;
			em.flush( ) ;
//			em.refresh( flujo ) ;
			
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.ErrorChangeStatusOnFlow" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_ADDING_FLOW , 
					e ) ;
		}
	}
	
	public static TblFlujo findFlujoById( int cveFlujo )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// verifica que nombre no este vacio
		if( cveFlujo < 1 )
			return null ;
		
		// ping( 216 ) ;
		
		// obtiene el registro
		TblFlujo tc = em.find( TblFlujo.class , new Integer( cveFlujo ) ) ;
		
		return tc ;
	}
	
	public static boolean removeFlujo( int cveFlujo )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveFlujo < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.CveFlujoWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_NAME_EMPTY , 
					null ) ;
		
		// ping( 217 ) ;
		
		// busca la forma
		TblFlujo flujo = em.find( TblFlujo.class , new Integer( cveFlujo ) ) ;
		
		// en caso de nula
		if( flujo == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.FlujoNotExist" , cveFlujo ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_EXITS_EMPTY , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// Crea la nueva forma
			
			flujo.setStatus( ( byte ) 0 ) ;
			
			em.merge( flujo ) ;
			em.flush( ) ;
//			em.refresh( flujo ) ;
			
			// manda todo a la base de datos
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.flujosf.add.errors.ErrorChangeStatusOnFlow" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_ERROR_ADDING_FLOW , 
					e ) ;
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	//////////////////// TAREAS
	
	public static boolean setFirstWork( int cveTarea )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de que sean menores qe 1
		if( cveTarea < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_WRONG , 
					null ) ;
		
		// ping( 218 ) ;
		
		// en caso de que no exista
		TblTarea tarea = em.find( TblTarea.class , new Integer(  cveTarea ) ) ;
		if( tarea == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_NOT_EXIST , 
					null ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
//			System.out.println( "MasterCardDAO: " + 1 ) ;
			// toma las tareas del flujo
			TblFlujo flujo = tarea.getTblFlujo( ) ;
			
//			System.out.println( "MasterCardDAO: " + 2 ) ;
			List< TblTarea > tareas = flujo.getTblTareas( ) ;
			
//			System.out.println( "MasterCardDAO: " + 3 + ": " + tareas.size( ) ) ;
			// recorre las tareas
			for( TblTarea tarea1 : tareas )
			{
//				System.out.println( "MasterCardDAO: " + 4 + " : " + tarea1.getCveTarea( ) ) ;
				// convierte todas a firstWork = 0
				tarea1.setFirstWork( ( byte ) 0 ) ;
				
//				System.out.println( "MasterCardDAO: " + 4.1 ) ;
				// actualiza
				em.merge( tarea1 ) ;
//				System.out.println( "MasterCardDAO: " + 4.2 ) ;
				em.flush( ) ;
//				System.out.println( "MasterCardDAO: " + 4.3 ) ;
//				em.refresh( tarea1 ) ;
//				System.out.println( "MasterCardDAO: " + 4.4 ) ;
			}
			
			// modifia la tarea
//			System.out.println( "MasterCardDAO: " + 5 ) ;
			tarea.setFirstWork( ( byte ) 1 ) ;
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
//			System.out.println( "MasterCardDAO: " + 6 ) ;
//			System.out.println( "MasterCardDAO: " + 7 ) ;
			
			et.commit( ) ;
//			System.out.println( "MasterCardDAO: " + 8 ) ;
			
			return true ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.ErrorChangeFirstWork" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_CHANGE_FIRST_WORK_ERROR , 
					null ) ;
		}

	}
	
	public static List< TblTarea > getAllActiveTareas( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		try
		{
			// ping( 219 ) ;
			
			Query q = em.createNamedQuery( "Tareas.FindAllActiveTareas" ) ;
			List< TblTarea > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblTarea >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTarea >( ) ;
		}
	}
	
	public static TblTarea getFirstWorkInFlow( int cveFlujo )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 220 ) ;
			
			Query q = em.createNamedQuery( "Tareas.FindFirstWorkInFlow" ) ;
			q.setParameter( "cveFlujo" , cveFlujo ) ;
			List< TblTarea > l = q.getResultList( ) ;

			// en caso de null
			if( l == null || l.size( ) == 0 )
				return null ;
			
			// en caso de que si haya resultados
			return l.get( 0 ) ;
		}catch( Exception e )
		{
			return null ;
		}
	}
        
        public static TblTarea getWorkInFlowentregaMateriales( int cveFlujo )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
						
			Query q = em.createNamedQuery( "Tareas.FindEntregaMaterialesCom" ) ;
			q.setParameter( "cveFlujo" , cveFlujo ) ;
			List< TblTarea > l = q.getResultList( ) ;
                                
			// en caso de null
			if( l == null || l.size( ) == 0 )
				return null ;
			
			// en caso de que si haya resultados
			return l.get( 0 ) ;
		}catch( Exception e )
		{
			return null ;
		}
	}
	
	public static List< TblTarea > getAllActiveTareasWithFlow( int cveFlow )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                        
		try
		{
			System.out.println( "GetAllActiveTareasWithFlow: " + cveFlow ) ;
			
			// ping( 221 ) ;
			
			Query q = em.createNamedQuery( "Tareas.FindAllActiveTareasWithFlow" ) ;
			q.setParameter( "flujo" , new Integer( cveFlow ) ) ;
			List< TblTarea > l = q.getResultList( ) ;
			
			System.out.println( "GetAllActiveTareasWithFlow: " + l ) ;
			System.out.println( "GetAllActiveTareasWithFlow: " + ( l == null ? 0 : l.size( ) ) ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblTarea >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTarea >( ) ;
		}
	}
	
	public static int addNewWork( 
			String nombre , 
			String description , 
			int cveRole , 
			int cveLevel , 
			int cveForma , 
			int cveFlujo , 
			boolean fechaActivaDias , 
			Timestamp fechaActivacionDateTimestamp , 
			int fechaActivacionDias , 
			int fechaActivacionDate ,
			boolean fechaLimitDias , 
			Timestamp fechaLimiteDateTimestamp , 
			int fechaLimiteDias , 
			int fechaLimiteDate ,
                        int multiple ,
                        int microFlujo
			)
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de que sean menores qe 1
		if( cveRole < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleWrong" , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_WRONG , 
					null ) ;
		
		// ping( 222 ) ;
		
		// en caso de que no exista
		TblRole role = em.find( TblRole.class , new Integer(  cveRole ) ) ;
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleNotExist" , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveForma < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FormWrong" , cveForma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblForma form = em.find( TblForma.class , new Integer(  cveForma ) ) ;
		if( form == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FormNotExist" , cveForma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveFlujo < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FlowWrong" , cveFlujo ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FLOW_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblFlujo flow = em.find( TblFlujo.class , new Integer(  cveFlujo ) ) ;
		if( flow == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FlowNotExist" , cveFlujo ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FLOW_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveLevel < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FlowWrong" , cveLevel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FLOW_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblNivel level = null ;
		if( cveLevel > 0 )
		{
			level = em.find( TblNivel.class , new Integer(  cveLevel ) ) ;
			if( level == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.LevelNotExist" , cveLevel ) , 
						MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_LEVEL_NOT_EXIST , 
						null ) ;
		}
		
		
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// revisa si ya existe la tarea pero inactiva
			TblTarea tarea = getUnactiveWorkWithNameInFlow( nombre , cveFlujo ) ;
			
			// en caso de null
			if( tarea == null )
				tarea = new TblTarea( ) ;
			
			// llena los datos
			tarea.setDescripcion( description ) ;
                        tarea.setMultiple( ( byte ) multiple ) ;
                        tarea.setMicroFlujo( ( byte ) microFlujo ) ;
			// verifica si par la fecha de activacion eligio dias o fecha directamente
			// en caso de dias
			if( fechaActivaDias )
			{
				tarea.setFechaActiva( null ) ;
				tarea.setFecActDias( fechaActivacionDias ) ;
				tarea.setFecActFecha( fechaActivacionDate ) ;
			}
			// en caso de fecha directamente
			else
			{
				tarea.setFechaActiva( fechaActivacionDateTimestamp ) ;
				tarea.setFecActDias( 0 ) ;
				tarea.setFecActFecha( 0 ) ;
			}
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			tarea.setFechaAlta( now ) ;
			// verifica si par la fecha de limite eligio dias o fecha directamente
			// en caso de dias
			if( fechaLimitDias )
			{
				tarea.setFechaLimite( null ) ;
				tarea.setFecLimDias( fechaLimiteDias ) ;
				tarea.setFecLimFechas( fechaLimiteDate ) ;
			}
			// en caso de fecha directamente
			else
			{
				tarea.setFechaLimite( fechaLimiteDateTimestamp ) ;
				tarea.setFecLimDias( 0 ) ;
				tarea.setFecLimFechas( 0 ) ;
			}
			tarea.setNombre( nombre ) ;
			tarea.setStatus( ( byte ) 1 ) ;
			tarea.setTblNivel( null ) ;
			tarea.setTblFlujo( flow ) ;
			tarea.setTblForma( form ) ;
			tarea.setTblRole( role ) ;
			
			// inserta
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			// agrega el flujo
			flow.getTblTareas( ).add( tarea ) ;
//			em.persist( tarea ) ;
////			em.flush( ) ;
//			em.refresh( tarea ) ;
			em.merge( flow ) ;
			em.flush( ) ;
//			em.refresh( flow ) ;
			
			// agrega forma
			form.getTblTareas( ).add( tarea ) ;
//			em.persist( tarea ) ;
//			em.flush( ) ;
//			em.refresh( tarea ) ;
			em.merge( form ) ;
			em.flush( ) ;
//			em.refresh( form ) ;
			
			// agrega role
			role.getTblTareas( ).add( tarea ) ;
//			em.persist( tarea ) ;
////			em.flush( ) ;
//			em.refresh( tarea ) ;
			em.merge( role ) ;
			em.flush( ) ;
//			em.refresh( role ) ;
			
			// agrega nivel
			// en caso de nivel == 0
			if( cveLevel > 0 )
			{
				tarea.setTblNivel( level ) ;
				level.getTblTareas( ).add( tarea ) ;
				em.merge( tarea ) ;
//				em.flush( ) ;
//				em.refresh( tarea ) ;
				em.merge( level ) ;
//				em.flush( ) ;
//				em.refresh( level ) ;
			}
			
			em.flush( ) ;
			
			et.commit( ) ;
			
			return tarea.getCveTarea( ) ;
			
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorAddingUser" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
	}
	
	public static boolean editWork(
			int cveTarea , 
			String nombre , 
			String description , 
			int cveRole , 
			int cveLevel , 
			int cveForma , 
			int cveFlujo , 
			boolean fechaActivaDias , 
			Timestamp fechaActivacionDateTimestamp , 
			int fechaActivacionDias , 
			int fechaActivacionDate ,
			boolean fechaLimitDias , 
			Timestamp fechaLimiteDateTimestamp , 
			int fechaLimiteDias , 
			int fechaLimiteDate ,
                        int multiple ,
                        int microFlujo
			)
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de que sean menores qe 1
		if( cveTarea < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_WRONG , 
					null ) ;
		
		// ping( 223 ) ;
		
		// en caso de que no exista
		TblTarea tarea = em.find( TblTarea.class , new Integer(  cveTarea ) ) ;
		if( tarea == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveRole < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleWrong" , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblRole role = em.find( TblRole.class , new Integer(  cveRole ) ) ;
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleNotExist" , cveRole ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveForma < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FormWrong" , cveForma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblForma form = em.find( TblForma.class , new Integer(  cveForma ) ) ;
		if( form == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FormNotExist" , cveForma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveFlujo < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FlowWrong" , cveFlujo ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FLOW_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblFlujo flow = em.find( TblFlujo.class , new Integer(  cveFlujo ) ) ;
		if( flow == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FlowNotExist" , cveFlujo ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FLOW_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveLevel < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FlowWrong" , cveLevel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FLOW_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblNivel level = null ;
		if( cveLevel > 0 )
		{
			level = em.find( TblNivel.class , new Integer(  cveLevel ) ) ;
			if( level == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.LevelNotExist" , cveLevel ) , 
						MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_LEVEL_NOT_EXIST , 
						null ) ;
		}
		
		
		
		// intenta colocar en el em
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// llena los datos
			tarea.setDescripcion( description ) ;
                        tarea.setMultiple( ( byte ) multiple ) ;
                        tarea.setMicroFlujo( ( byte ) microFlujo ) ;
			// verifica si par la fecha de activacion eligio dias o fecha directamente
			// en caso de dias
			if( fechaActivaDias )
			{
				tarea.setFechaActiva( null ) ;
				tarea.setFecActDias( fechaActivacionDias ) ;
				tarea.setFecActFecha( fechaActivacionDate ) ;
			}
			// en caso de fecha directamente
			else
			{
				tarea.setFechaActiva( fechaActivacionDateTimestamp ) ;
				tarea.setFecActDias( 0 ) ;
				tarea.setFecActFecha( 0 ) ;
			}
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			tarea.setFechaAlta( now ) ;
			// verifica si par la fecha de limite eligio dias o fecha directamente
			// en caso de dias
			if( fechaLimitDias )
			{
				tarea.setFechaLimite( null ) ;
				tarea.setFecLimDias( fechaLimiteDias ) ;
				tarea.setFecLimFechas( fechaLimiteDate ) ;
			}
			// en caso de fecha directamente
			else
			{
				tarea.setFechaLimite( fechaLimiteDateTimestamp ) ;
				tarea.setFecLimDias( 0 ) ;
				tarea.setFecLimFechas( 0 ) ;
			}
			tarea.setNombre( nombre ) ;
			tarea.setStatus( ( byte ) 1 ) ;
			tarea.setTblNivel( null ) ;
			tarea.setTblFlujo( flow ) ;
			tarea.setTblForma( form ) ;
			tarea.setTblRole( role ) ;
			
			// inserta
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			// agrega el flujo
			flow.getTblTareas( ).add( tarea ) ;
//			em.persist( tarea ) ;
////			em.flush( ) ;
//			em.refresh( tarea ) ;
			em.merge( flow ) ;
			em.flush( ) ;
//			em.refresh( flow ) ;
			
			// agrega forma
			form.getTblTareas( ).add( tarea ) ;
//			em.persist( tarea ) ;
//			em.flush( ) ;
//			em.refresh( tarea ) ;
			em.merge( form ) ;
			em.flush( ) ;
//			em.refresh( form ) ;
			
			// agrega role
			role.getTblTareas( ).add( tarea ) ;
//			em.persist( tarea ) ;
////			em.flush( ) ;
//			em.refresh( tarea ) ;
			em.merge( role ) ;
			em.flush( ) ;
//			em.refresh( role ) ;
			
			// agrega nivel
			// en caso de nivel == 0
			if( cveLevel > 0 )
			{
				tarea.setTblNivel( level ) ;
				level.getTblTareas( ).add( tarea ) ;
				em.merge( tarea ) ;
//				em.flush( ) ;
//				em.refresh( tarea ) ;
				em.merge( level ) ;
//				em.flush( ) ;
//				em.refresh( level ) ;
			}
			
			em.flush( ) ;
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			et.rollback( ) ;
			e.printStackTrace( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorAddingUser" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_ERROR , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean existActiveWorkWithNameInFlow( 
													String nombre , 
													int cveFlujo , 
													int cveTarea
												)
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveFlujo < 1 )
			return false ;
		
		if( nombre == null )
			return false ;
		
		try
		{
			// ping( 224 ) ;
			
			Query q = em.createNamedQuery( "Tareas.FindAllActiveTareasWithNameInFlow" ) ;
			
			q.setParameter( "nombre" , nombre ) ;
			q.setParameter( "cveFlujo" , new Integer( cveFlujo ) ) ;
			
			List< TblTarea > tareas = q.getResultList( ) ;
			
			if( tareas == null || tareas.size( ) == 0 )
				return false ;
			else if( tareas.size( ) == 1 && tareas.get( 0 ).getCveTarea( ) == cveTarea )
				return false ;
			else
				return true ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			return false ;
		}
	}
	
	public static TblTarea getActiveWorkWithNameInFlow( 
													String nombre , 
													int cveFlujo 
												)
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveFlujo < 1 )
			return null ;
		
		if( nombre == null )
			return null ;
		
		try
		{
			// ping( 225 ) ;
			
			Query q = em.createNamedQuery( "Tareas.FindAllActiveTareasWithNameInFlow" ) ;
			
			q.setParameter( "nombre" , nombre ) ;
			q.setParameter( "cveFlujo" , new Integer( cveFlujo ) ) ;
			
			List< TblTarea > tareas = q.getResultList( ) ;
			
			if( tareas == null || tareas.size( ) == 0 )
				return null ;
			else
				return tareas.get( 0 ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			return null ;
		}
	}
	
	public static TblTarea getUnactiveWorkWithNameInFlow( 
													String nombre , 
													int cveFlujo 
												)
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveFlujo < 1 )
			return null ;
		
		if( nombre == null )
			return null ;
		
		try
		{
			// ping( 226 ) ;
			
			Query q = em.createNamedQuery( "Tareas.FindAllUnactiveTareasWithNameInFlow" ) ;
			
			q.setParameter( "nombre" , nombre ) ;
			q.setParameter( "cveFlujo" , new Integer( cveFlujo ) ) ;
			
			List< TblTarea > tareas = q.getResultList( ) ;
			
			if( tareas == null || tareas.size( ) == 0 )
				return null ;
			else
				return tareas.get( 0 ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			return null ;
		}
	}
	
	public static boolean removeWork(  
								int cveWork 
									)
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveWork < 1 )
			return false ;
		
		// en caso de que no exista
		TblTarea tarea = em.find( TblTarea.class , new Integer(  cveWork ) ) ;
		if( tarea == null )
			return false ;
		
		// ping( 227 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			tarea.setStatus( ( byte ) 0 ) ;
			
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.work.nuevo.dao.ErrorRemovingWork" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_REMOVE_WORK , 
					e ) ;
		}
	}
	
	public static TblTarea findWorkById( int cveTarea )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( cveTarea < 1 )
			return null ;
		
		// ping( 228 ) ;
		
		// obtiene el registro
		TblTarea tc = em.find( TblTarea.class , new Integer( cveTarea ) ) ;
		
		return tc ;
	}

	public static int getNumberOfAlertsOnExitWork( int cveTarea , int cveSalida )
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		
		try
		{
			// ping( 229 ) ;
			
			Query q = em.createNamedQuery( "Tareas.HowManyAlertsHaveWorkExit" ) ;
			q.setParameter( "cveTarea" , new Integer( cveTarea ) ) ;
			q.setParameter( "cveSalida" , new Integer( cveSalida ) ) ;
			
			List res = q.getResultList( ) ;
			
			if( res == null || res.size( ) == 0 )
				return 0 ;
			else
				return res.size( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			return -1 ;
		}
	}
	
	public static boolean updateExitsOnWork( int cveTarea , int cveSalida , int[ ] cveTareas )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveTarea < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_WRONG , 
					null ) ;
		
		// ping( 230 ) ;
		
		// en caso de que no exista
		TblTarea tarea = em.find( TblTarea.class , new Integer(  cveTarea ) ) ;
		if( tarea == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveSalida < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.ExitWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_EXIT_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblFormaSalida salida = em.find( TblFormaSalida.class , new Integer(  cveSalida ) ) ;
		if( salida == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.ExitNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_EXIT_NOT_EXIST , 
					null ) ;
		
		if( cveTareas == null )
			cveTareas = new int[ 0 ] ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( "!!!!!!!!!!!!!!!!!! " ) ;
			et.begin( ) ;
			
			em.refresh( tarea ) ;
			
			// toma los registros
			List< TblTareaFlujo > registros = tarea.getTblTareaFlujos1( ) ;
			
			List< TblTareaFlujo > registrosNew = new ArrayList< TblTareaFlujo >( ) ;
			List< TblTareaFlujo > registrosOld = new ArrayList< TblTareaFlujo >( ) ;
			
//			System.out.println( "Numero de registros: " + registros.size( ) ) ;
			
			// borra los que coincidan con la salida dada
			for( TblTareaFlujo tf : registros )
			{
				// verifica si es la misma salida
				TblFormaSalida sal = tf.getTblFormaSalida( ) ;
				
//				System.out.println( "Registro: " + sal.getCveSalida( ) + " y " + cveSalida ) ;
				
				if( sal.getCveSalida( ) == cveSalida )
					// guarda en viejos
					registrosOld.add( tf ) ;
				// en caso de que no sea la misma salida
				else
					registrosNew.add( tf ) ;
			}
			
//			System.out.println( "RegistrosOld: " + registrosOld.size( ) ) ;
			
			// borra los viejos
			for( TblTareaFlujo tf : registrosOld )
			{
				// revisa los datos
				TblTareaFlujoPK pk = tf.getId( ) ;
				
				boolean same = false ;
				
				int pkTarea = pk.getCveTareaSigue( ) ;
				
//				System.out.println( "Combinacion: " + pkTarea + " - " + pk.getCveSalida( ) + " - " + pk.getCveTarea( ) ) ;
				
				// recorre las tareas
				for( int tareaId : cveTareas )
				{
//					System.out.println( "Tarea Comparada: " + tareaId ) ;
					if( tareaId == pkTarea )
					{
						same = true ;
						
						break ;
					}
				}
				
//				System.out.println( "Existe: " + same ) ;
//				System.out.println( "Existe: " + ( ! same && pk.getCveSalida( ) == cveSalida && pk.getCveTarea( ) == cveTarea ) ) ;
				// en caso de que no este dentro de las tareas que eligio
				// se borra
				if( ! same && pk.getCveSalida( ) == cveSalida && pk.getCveTarea( ) == cveTarea )
				{
					
					em.remove( tf ) ;
					em.flush( ) ;
//					em.refresh( tf ) ;
					
					// borra de salida
					salida.getTblFormaAlertas( ).remove( tf ) ;
					em.merge( salida ) ;
					em.flush( ) ;
//					em.refresh( salida ) ;
					
					// borra de tarea
					tarea.getTblTareaFlujos1( ).remove( tf ) ;
					em.merge( tarea ) ;
					em.flush( ) ;
//					em.refresh( tarea ) ;
					
					// borra de tarea sigue
					TblTarea sigue = tf.getTblTarea2( ) ;
					sigue.getTblTareaFlujos2( ).remove( tf ) ;
					em.merge( sigue ) ;
					em.flush( ) ;
//					em.refresh( sigue ) ;
				}
			}
			
			registros = tarea.getTblTareaFlujos1( ) ;
			
			// recorre las tareas
			for( int cveTareaSigue : cveTareas )
			{
				// en caso de menos a 1
				if( cveTareaSigue < 1 )
					continue ;
				
				// revisa si ya existe
				boolean yaExiste = false ;
				
				for( TblTareaFlujo ttf : registros )
				{
					// toma la llave
					TblTareaFlujoPK pk = ttf.getId( ) ;
					
					if( pk.getCveSalida( ) == cveSalida && pk.getCveTarea( ) == cveTarea && pk.getCveTareaSigue( ) == cveTareaSigue )
					{
						yaExiste = true ;
						
						break ;
					}
				}
				
				// en caso de que ya exista
				if( yaExiste )
					// va al siguiente
					continue ;
				
				// busca tareal
				TblTarea t = em.find( TblTarea.class , new Integer( cveTareaSigue ) ) ;
				
//				System.out.println( "Tarea de id " + cveTareaSigue + " : " + t ) ;
				
				// en cao de que no exista se pasa al siguiente
				if( t == null )
					continue ;
				
				// en caso de que si exista
				TblTareaFlujo ttf = new TblTareaFlujo( ) ;
				TblTareaFlujoPK pk = new TblTareaFlujoPK( ) ;
				pk.setCveSalida( salida.getCveSalida( ) ) ;
				pk.setCveTarea( tarea.getCveTarea( ) ) ;
				pk.setCveTareaSigue( t.getCveTarea( ) ) ;
				ttf.setId( pk ) ;
				ttf.setTblFormaSalida( salida ) ;
				ttf.setTblTarea1( tarea ) ;
				ttf.setTblTarea2( t ) ;
				em.persist( ttf ) ;
				
				t.getTblTareaFlujos2( ).add( ttf ) ;
				em.merge( t ) ;
				
				salida.getTblTareaFlujos( ).add( ttf ) ;
				em.merge( salida ) ;
				
				tarea.getTblTareaFlujos2( ).add( ttf ) ;
				em.merge( tarea ) ;
				
				registros = tarea.getTblTareaFlujos1( ) ;
			}
			
			// actualiza tareas
//			tarea.setTblTareaFlujos1( registrosNew ) ;
//			
//			em.persist( tarea ) ;
//			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorUpdateExits" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_UPDATE_EXIT , 
					e ) ;
			
		}
		
		return true ;
	}
	
	
	
	
	
	
	//////////////////////// SALIDAS
	
	public static TblFormaSalida findExitById( int cveSalida )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( cveSalida < 1 )
			return null ;
		
		// ping( 231 ) ;
		
		// obtiene el registro
		TblFormaSalida tc = em.find( TblFormaSalida.class , new Integer( cveSalida ) ) ;
		
		return tc ;
	}
	
	public static boolean addNewAlertInExitWork( int cveTarea , int cveSalida , int cveAlerta , int cveRol , int cveNivel , int tipoAlerta , String email )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveTarea < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_WRONG , 
					null ) ;
		
		// ping( 232 ) ;
		
		// en caso de que no exista
		TblTarea tarea = em.find( TblTarea.class , new Integer(  cveTarea ) ) ;
		if( tarea == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveSalida < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.ExitWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_EXIT_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblFormaSalida salida = em.find( TblFormaSalida.class , new Integer(  cveSalida ) ) ;
		if( salida == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.ExitNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_EXIT_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.AlertWrong" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ALERT_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblAlerta alerta = em.find( TblAlerta.class , new Integer(  cveAlerta ) ) ;
		if( alerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.AlertNotExist" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ALERT_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveRol < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleWrong" , cveRol ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblRole role = em.find( TblRole.class , new Integer(  cveRol ) ) ;
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleNotExist" , cveRol ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveNivel < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.LevelWrong" , cveNivel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_LEVEL_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblNivel nivel = em.find( TblNivel.class , new Integer(  cveNivel ) ) ;
		
		if( email == null || email.trim( ).length( ) == 0 )
			email = "" ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( "!!!!!!!!!!!!!!!!!! " ) ;
			et.begin( ) ;
			
			// forma la alerta
			TblFormaAlerta tblFormaAlerta = new TblFormaAlerta( ) ;
			
			tblFormaAlerta.setEmail( ( tipoAlerta != 2 ) ? email : "" ) ;
			tblFormaAlerta.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			tblFormaAlerta.setStatus( ( byte ) 1 ) ;
			tblFormaAlerta.setTblAlerta( alerta ) ;
			tblFormaAlerta.setTblFormaSalida( salida ) ;
			tblFormaAlerta.setTblNivel( nivel ) ;
			tblFormaAlerta.setTblRole( role ) ;
			tblFormaAlerta.setTblTarea( tarea ) ;
			tblFormaAlerta.setTipo( tipoAlerta ) ;
			
			// agrega a la base
			em.persist( tblFormaAlerta ) ;
			em.flush( ) ;
			em.refresh( tblFormaAlerta ) ;
			
			// agrega a las alertas
			alerta.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
			em.merge( alerta ) ;
			em.flush( ) ;
//			em.refresh( alerta ) ;
			
			// agrega a la salida
			salida.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
			em.merge( salida ) ;
			em.flush( ) ;
//			em.refresh( salida ) ;
			
			// agrega al nivel
			if( nivel != null )
			{
				nivel.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
				em.merge( nivel ) ;
				em.flush( ) ;
//				em.refresh( nivel ) ;
			}
			
			// agrega a la role
			role.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
			em.merge( role ) ;
			em.flush( ) ;
//			em.refresh( role ) ;
			
			// agrega a la tarea
			tarea.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorUpdateExits" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_UPDATE_EXIT , 
					e ) ;
			
		}
		
		return true ;
	}
	
	public static boolean editAlertInExitWork( int cveFormaAlerta , int cveTarea , int cveSalida , int cveAlerta , int cveRol , int cveNivel , int tipoAlerta , String email )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveFormaAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FormAlertWrong" , cveFormaAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_ALERT_WRONG , 
					null ) ;
		
		// ping( 233 ) ;
		
		// en caso de que no exista
		TblFormaAlerta tblFormaAlerta = em.find( TblFormaAlerta.class , new Integer(  cveFormaAlerta ) ) ;
		if( tblFormaAlerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FormAlertNotExist" , cveFormaAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_ALERT_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveTarea < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblTarea tarea = em.find( TblTarea.class , new Integer(  cveTarea ) ) ;
		if( tarea == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveSalida < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.ExitWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_EXIT_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblFormaSalida salida = em.find( TblFormaSalida.class , new Integer(  cveSalida ) ) ;
		if( salida == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.ExitNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_EXIT_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.AlertWrong" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ALERT_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblAlerta alerta = em.find( TblAlerta.class , new Integer(  cveAlerta ) ) ;
		if( alerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.AlertNotExist" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ALERT_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveRol < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleWrong" , cveRol ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblRole role = em.find( TblRole.class , new Integer(  cveRol ) ) ;
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleNotExist" , cveRol ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveNivel < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.LevelWrong" , cveNivel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_LEVEL_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblNivel nivel = em.find( TblNivel.class , new Integer(  cveNivel ) ) ;
		
		if( email == null || email.trim( ).length( ) == 0 )
			email = "" ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( "!!!!!!!!!!!!!!!!!! " ) ;
			et.begin( ) ;
			
			boolean alertaDif = false ;
			TblAlerta oldAlerta = tblFormaAlerta.getTblAlerta( ) ;
			if( alerta.getCveAlerta( ) != oldAlerta.getCveAlerta( ) )
				alertaDif = true ;
			
			boolean formaSalidaDif = false ;
			TblFormaSalida oldFormaSalida = tblFormaAlerta.getTblFormaSalida( ) ;
			if( salida.getCveSalida( ) != oldFormaSalida.getCveSalida( ) )
				formaSalidaDif = true ;
			
			boolean nivelDif = false ;
			TblNivel oldNivel = tblFormaAlerta.getTblNivel( ) ;
			if( nivel != null && nivel.getCveNivel( ) != oldNivel.getCveNivel( ) )
				nivelDif = true ;
			
			boolean roleDif = false ;
			TblRole oldRole = tblFormaAlerta.getTblRole( ) ;
			if( role.getCveRole( ) != oldRole.getCveRole( ) )
				roleDif = true ;
			
			boolean tareaDif = false ;
			TblTarea oldTarea = tblFormaAlerta.getTblTarea( ) ;
			if( tarea.getCveTarea( ) != oldTarea.getCveTarea( ) )
				tareaDif = true ;
			
			// forma la alerta
			tblFormaAlerta.setEmail( ( tipoAlerta != 2 ) ? email : "" ) ;
//			tblFormaAlerta.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
//			tblFormaAlerta.setStatus( ( byte ) 1 ) ;
			if( alertaDif )
				tblFormaAlerta.setTblAlerta( alerta ) ;
			if( formaSalidaDif )
				tblFormaAlerta.setTblFormaSalida( salida ) ;
			if( nivelDif )
				tblFormaAlerta.setTblNivel( nivel ) ;
			if( roleDif )
				tblFormaAlerta.setTblRole( role ) ;
			if( tareaDif )
				tblFormaAlerta.setTblTarea( tarea ) ;
			tblFormaAlerta.setTipo( tipoAlerta ) ;
			
			// agrega a la base
			em.merge( tblFormaAlerta ) ;
			em.flush( ) ;
//			em.refresh( tblFormaAlerta ) ;
			
			// agrega a las alertas
			// verifica que sean diferentes las alertas
			if( alertaDif )
			{
				// borra del anterior
				oldAlerta.getTblFormaAlertas( ).remove( tblFormaAlerta ) ;
				em.merge( oldAlerta ) ;
				em.flush( ) ;
//				em.refresh( oldAlerta ) ;
				
				alerta.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
				em.merge( alerta ) ;
				em.flush( ) ;
//				em.refresh( alerta ) ;
			}
			
			if( formaSalidaDif )
			{
				// borra del anterior
				oldFormaSalida.getTblFormaAlertas( ).remove( tblFormaAlerta ) ;
				em.merge( oldFormaSalida ) ;
				em.flush( ) ;
//				em.refresh( oldFormaSalida ) ;
				
				// agrega a la salida
				salida.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
				em.merge( salida ) ;
				em.flush( ) ;
//				em.refresh( salida ) ;
			}
			
			// agrega al nivel
			if( nivel != null )
			{
				// verifica que sean diferentes las alertas
				if( nivelDif )
				{
					// borra del anterior
					oldNivel.getTblFormaAlertas( ).remove( tblFormaAlerta ) ;
					em.merge( oldNivel ) ;
					em.flush( ) ;
//					em.refresh( oldNivel ) ;
					
					nivel.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
					em.merge( nivel ) ;
					em.flush( ) ;
//					em.refresh( nivel ) ;

				}
			}
			
			
			if( roleDif )
			{
				// borra del anterior
				oldRole.getTblFormaAlertas( ).remove( tblFormaAlerta ) ;
				em.merge( oldRole ) ;
				em.flush( ) ;
//				em.refresh( oldRole ) ;
				
				// agrega a la role
				role.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
				em.merge( role ) ;
				em.flush( ) ;
//				em.refresh( role ) ;
			}
			
			// verifica que sean diferentes las alertas
			if( tareaDif )
			{
				// borra del anterior
				oldTarea.getTblFormaAlertas( ).remove( tblFormaAlerta ) ;
				em.merge( oldTarea ) ;
				em.flush( ) ;
//				em.refresh( oldTarea ) ;
				
				// agrega a la tarea
				tarea.getTblFormaAlertas( ).add( tblFormaAlerta ) ;
				em.merge( tarea ) ;
				em.flush( ) ;
//				em.refresh( tarea ) ;
			}
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorUpdateExits" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_UPDATE_EXIT , 
					e ) ;
			
		}
		
		return true ;
	}
	
	public static boolean eraseAlertInExitWork( int cveFormaAlerta )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveFormaAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FormAlertWrong" , cveFormaAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_ALERT_WRONG , 
					null ) ;
		
		// ping( 234 ) ;
		
		// en caso de que no exista
		TblFormaAlerta formaAlerta = em.find( TblFormaAlerta.class , new Integer(  cveFormaAlerta ) ) ;
		if( formaAlerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.FormAlertNotExist" , cveFormaAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_ALERT_NOT_EXIST , 
					null ) ;
		
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( "!!!!!!!!!!!!!!!!!! " ) ;
			et.begin( ) ;
			
			// cambia sttus
			formaAlerta.setStatus( ( byte ) 0 ) ;
			em.merge( formaAlerta ) ;
			em.flush( ) ;
//			em.refresh( formaAlerta ) ;
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorUpdateExits" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_UPDATE_EXIT , 
					e ) ;
			
		}
		
		return true ;
	}
	
	public static TblFormaAlerta findFormAlertById( int cveFormaAlerta )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( cveFormaAlerta < 1 )
			return null ;
		
		// ping( 235 ) ;
		
		// obtiene el registro
		TblFormaAlerta tc = em.find( TblFormaAlerta.class , new Integer( cveFormaAlerta ) ) ;
		
		return tc ;
	}
	
	
	
	
	
	
	
	
	
	
	///////////////////// ALARMAS
	
	public static List< TblFormaAlarma > getAllActiveAlarmsInWork( int cveTarea )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 236 ) ;
			
			Query q = em.createNamedQuery( "Alarms.FindAllActiveAlarmsInWork" ) ;
			q.setParameter( "cveTarea" , new Integer( cveTarea ) ) ;
			List< TblFormaAlarma > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblFormaAlarma >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblFormaAlarma >( ) ;
		}
	}
	
	public static boolean addNewAlarmInWork( int cveTarea , int cveAlerta , int cveRol , int cveNivel , int tipoAlerta , String email , int tipoAlarma , int dias , int horas )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveTarea < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_WRONG , 
					null ) ;
		
		// ping( 237 ) ;
		
		// en caso de que no exista
		TblTarea tarea = em.find( TblTarea.class , new Integer(  cveTarea ) ) ;
		if( tarea == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.AlertWrong" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ALERT_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblAlerta alerta = em.find( TblAlerta.class , new Integer(  cveAlerta ) ) ;
		if( alerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.AlertNotExist" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ALERT_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveRol < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleWrong" , cveRol ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblRole role = em.find( TblRole.class , new Integer(  cveRol ) ) ;
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleNotExist" , cveRol ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveNivel < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.LevelWrong" , cveNivel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_LEVEL_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblNivel nivel = em.find( TblNivel.class , new Integer(  cveNivel ) ) ;
		
		if( email == null || email.trim( ).length( ) == 0 )
			email = "" ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( "!!!!!!!!!!!!!!!!!! " ) ;
			et.begin( ) ;
			
			// forma la alerta
			TblFormaAlarma tblFormaAlarma = new TblFormaAlarma( ) ;
			
			tblFormaAlarma.setEmail( ( tipoAlerta != 2 ) ? email : "" ) ;
			tblFormaAlarma.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			tblFormaAlarma.setStatus( ( byte ) 1 ) ;
			tblFormaAlarma.setTblAlerta( alerta ) ;
			tblFormaAlarma.setTblNivel( nivel ) ;
			tblFormaAlarma.setTblRole( role ) ;
			tblFormaAlarma.setTblTarea( tarea ) ;
			tblFormaAlarma.setTipo( tipoAlerta ) ;
			tblFormaAlarma.setTipoAlarma( tipoAlarma ) ;
			tblFormaAlarma.setDiasAlarma( dias ) ;
			tblFormaAlarma.setHorasAlarma( ( byte ) horas ) ;
			
			// agrega a la base
			em.persist( tblFormaAlarma ) ;
			em.flush( ) ;
			em.refresh( tblFormaAlarma ) ;
			
			// agrega a las alertas
			alerta.getTblFormaAlarmas( ).add( tblFormaAlarma ) ;
			em.merge( alerta ) ;
			em.flush( ) ;
//			em.refresh( alerta ) ;
			
			// agrega al nivel
			if( nivel != null )
			{
				nivel.getTblFormaAlarmas( ).add( tblFormaAlarma ) ;
				em.merge( nivel ) ;
				em.flush( ) ;
//				em.refresh( nivel ) ;
			}
			
			// agrega a la role
			role.getTblFormaAlarmas( ).add( tblFormaAlarma ) ;
			em.merge( role ) ;
			em.flush( ) ;
//			em.refresh( role ) ;
			
			// agrega a la tarea
			tarea.getTblFormaAlarmas( ).add( tblFormaAlarma ) ;
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorUpdateExits" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_UPDATE_EXIT , 
					e ) ;
			
		}
		
		return true ;
	}
	
	public static boolean editAlarmInWork( int cveAlarma , int cveTarea , int cveAlerta , int cveRol , int cveNivel , int tipoAlerta , String email , int tipoAlarma , int dias , int horas )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
//		System.out.println( "Editar###" ) ;
		// en caso de que sean menores qe 1
		if( cveAlarma < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alarmas.add.errors.AlarmWrong" , cveAlarma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_ALARM_WRONG , 
					null ) ;
		
		// ping( 238 ) ;
		
		// en caso de que no exista
		TblFormaAlarma tblFormaAlarma = em.find( TblFormaAlarma.class , new Integer(  cveAlarma ) ) ;
		if( tblFormaAlarma == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alarmas.add.errors.AlarmNotExist" , cveAlarma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveTarea < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkWrong" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblTarea tarea = em.find( TblTarea.class , new Integer(  cveTarea ) ) ;
		if( tarea == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.WorkNotExist" , cveTarea ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_WORK_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveAlerta < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.AlertWrong" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ALERT_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblAlerta alerta = em.find( TblAlerta.class , new Integer(  cveAlerta ) ) ;
		if( alerta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.AlertNotExist" , cveAlerta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ALERT_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveRol < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleWrong" , cveRol ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblRole role = em.find( TblRole.class , new Integer(  cveRol ) ) ;
		if( role == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.RoleNotExist" , cveRol ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_ROLE_NOT_EXIST , 
					null ) ;
		
		// en caso de que sean menores qe 1
		if( cveNivel < 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.tareas.add.errors.LevelWrong" , cveNivel ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_LEVEL_WRONG , 
					null ) ;
		
		// en caso de que no exista
		TblNivel nivel = em.find( TblNivel.class , new Integer(  cveNivel ) ) ;
		
		if( email == null || email.trim( ).length( ) == 0 )
			email = "" ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( "!!!!!!!!!!!!!!!!!! " ) ;
			et.begin( ) ;
			
			// forma la alerta
//			TblFormaAlarma tblFormaAlarma = new TblFormaAlarma( ) ;
			
			boolean alertaDif = false ;
			TblAlerta oldAlerta = tblFormaAlarma.getTblAlerta( ) ;
			if( alerta.getCveAlerta( ) != oldAlerta.getCveAlerta( ) )
				alertaDif = true ;
			
			boolean nivelDif = false ;
			TblNivel oldNivel = tblFormaAlarma.getTblNivel( ) ;
			if( nivel == null && oldNivel == null )
				nivelDif = false ;
			else if( nivel == null && oldNivel != null )
				nivelDif = true ;
			else if( nivel != null && oldNivel == null )
				nivelDif = true ;
			else if( nivel.getCveNivel( ) != oldNivel.getCveNivel( ) )
				nivelDif = true ;
			
			boolean roleDif = false ;
			TblRole oldRole = tblFormaAlarma.getTblRole( ) ;
			if( role.getCveRole( ) != oldRole.getCveRole( ) )
				roleDif = true ;
			
			boolean tareaDif = false ;
			TblTarea oldTarea = tblFormaAlarma.getTblTarea( ) ;
			if( tarea.getCveTarea( ) != oldTarea.getCveTarea( ) )
				tareaDif = true ;
			
			tblFormaAlarma.setEmail( ( tipoAlerta != 2 ) ? email : "" ) ;
//			tblFormaAlarma.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
//			tblFormaAlarma.setStatus( ( byte ) 1 ) ;
			tblFormaAlarma.setTblAlerta( alerta ) ;
			tblFormaAlarma.setTblNivel( nivel ) ;
			tblFormaAlarma.setTblRole( role ) ;
			tblFormaAlarma.setTblTarea( tarea ) ;
			tblFormaAlarma.setTipo( tipoAlerta ) ;
			tblFormaAlarma.setTipoAlarma( tipoAlarma ) ;
			tblFormaAlarma.setDiasAlarma( dias ) ;
			tblFormaAlarma.setHorasAlarma( ( byte ) horas ) ;
			
			// agrega a la base
			em.merge( tblFormaAlarma ) ;
			em.flush( ) ;
//			em.refresh( tblFormaAlarma ) ;
			
			// agrega a las alertas
			// verifica que sean diferentes las alertas
			if( alertaDif )
			{
				// borra del anterior
				oldAlerta.getTblFormaAlarmas( ).remove( tblFormaAlarma ) ;
				em.merge( oldAlerta ) ;
				em.flush( ) ;
//				em.refresh( oldAlerta ) ;
				
				alerta.getTblFormaAlarmas( ).add( tblFormaAlarma ) ;
				em.merge( alerta ) ;
				em.flush( ) ;
//				em.refresh( alerta ) ;
			}
			
			// agrega al nivel
			if( nivel != null )
			{
				// verifica que sean diferentes las alertas
				if( nivelDif )
				{
					if( oldNivel != null )
					{
						// borra del anterior
						oldNivel.getTblFormaAlarmas( ).remove( tblFormaAlarma ) ;
						em.merge( oldNivel ) ;
						em.flush( ) ;
//						em.refresh( oldNivel ) ;
					}
					
					if( nivel != null )
					{
						nivel.getTblFormaAlarmas( ).add( tblFormaAlarma ) ;
						em.merge( nivel ) ;
						em.flush( ) ;
//						em.refresh( nivel ) ;
					}

				}
			}
			
			
			if( roleDif )
			{
				// borra del anterior
				oldRole.getTblFormaAlarmas( ).remove( tblFormaAlarma ) ;
				em.merge( oldRole ) ;
				em.flush( ) ;
//				em.refresh( oldRole ) ;
				
				// agrega a la role
				role.getTblFormaAlarmas( ).add( tblFormaAlarma ) ;
				em.merge( role ) ;
				em.flush( ) ;
//				em.refresh( role ) ;
			}
			
			// verifica que sean diferentes las alertas
			if( tareaDif )
			{
				// borra del anterior
				oldTarea.getTblFormaAlarmas( ).remove( tblFormaAlarma ) ;
				em.merge( oldTarea ) ;
				em.flush( ) ;
//				em.refresh( oldTarea ) ;
				
				// agrega a la tarea
				tarea.getTblFormaAlarmas( ).add( tblFormaAlarma ) ;
				em.merge( tarea ) ;
				em.flush( ) ;
//				em.refresh( tarea ) ;
			}
			
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorUpdateExits" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_UPDATE_EXIT , 
					e ) ;
			
		}
		
		return true ;
	}
	
	public static boolean eraseAlarmInWork( int cveFormaAlarma )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sean menores qe 1
		if( cveFormaAlarma < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alarmas.add.errors.FormAlarmWrong" , cveFormaAlarma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_ALARM_WRONG , 
					null ) ;
		
		// ping( 239 ) ;
		
		// en caso de que no exista
		TblFormaAlarma formaAlarma = em.find( TblFormaAlarma.class , new Integer(  cveFormaAlarma ) ) ;
		if( formaAlarma == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.alarmas.add.errors.FormAlarmNotExist" , cveFormaAlarma ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_FORM_ALARM_NOT_EXIST , 
					null ) ;
		
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
//			System.out.println( "!!!!!!!!!!!!!!!!!! " ) ;
			et.begin( ) ;
			
			// cambia sttus
			formaAlarma.setStatus( ( byte ) 0 ) ;
			em.merge( formaAlarma ) ;
			em.flush( ) ;
//			em.refresh( formaAlarma ) ;
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.nuevo.dao.ErrorUpdateExits" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_WORKS_ERROR_UPDATE_EXIT , 
					e ) ;
			
		}
		
		return true ;
	}
	
	public static TblFormaAlarma findAlarmById( int cveAlarma )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( cveAlarma < 1 )
			return null ;
		
		// ping( 240 ) ;
		
		// obtiene el registro
		TblFormaAlarma tc = em.find( TblFormaAlarma.class , new Integer( cveAlarma ) ) ;
		
		return tc ;
	}
	
	
	public static TblPreimplementacionCotiza findPreImplCotizaById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// obtiene el registro
		TblPreimplementacionCotiza tc = em.find( TblPreimplementacionCotiza.class , new Integer( cve ) ) ;
		
		return tc ;
	}
	
	
	///////////////// preimplementacion
	
	public static List< TblPreimplementacion > getAllActivePreimplementations( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 241 ) ;
			
			Query q = em.createNamedQuery( "Preimplementations.FindAllActivePreimplementation" ) ;
			List< TblPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblPreimplementacion >( ) ;
			
			for( TblPreimplementacion pre : l )
				em.refresh( pre ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPreimplementacion >( ) ;
		}
	}
        
        public static List< TblPreimplementacion > getAllActivePreimplementationsAndClosed( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{	
			Query q = em.createNamedQuery( "Preimplementations.FindAllActivePreimplementationAndClosed" ) ;
			List< TblPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblPreimplementacion >( ) ;
			
			for( TblPreimplementacion pre : l )
				em.refresh( pre ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPreimplementacion >( ) ;
		}
	}
        
        public static TblPreimplementacion getClosedPreimplementationsByAssetAndFlow( int cveAsset )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
                    TblPreimplementacion PI = new TblPreimplementacion( ) ;
			Query q = em.createNamedQuery( "Preimplementations.FindClosedPreimplementationByFlowAndAsset" ) ;
			List< TblPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return PI ;
			
			for( TblPreimplementacion pre : l )
                        {
                            List< TblAsset > al = pre.getTblAssets( ) ;
                            for( TblAsset asset : al )
                            {
                                if( asset.getCveAsset( ) == cveAsset && PI.getCvePreimplementacion( ) < pre.getCvePreimplementacion( ) )
                                    PI = pre ;
                            }
                        }				
			
			// en caso de que si haya resultados
			return PI ;
		}catch( Exception e )
		{
			return new TblPreimplementacion( ) ;
		}
	}
        
        public static List< TblPreimplementacion > getAllActivePreimplementationsClosed( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{			
			Query q = em.createNamedQuery( "Preimplementations.FindAllActivePreimplementationClosed" ) ;
			List< TblPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblPreimplementacion >( ) ;
			
			for( TblPreimplementacion pre : l )
				em.refresh( pre ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPreimplementacion >( ) ;
		}
	}
	
	public static List< TblPreimplementacion > getAllInactivePreimplementations( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 242 ) ;
			
			Query q = em.createNamedQuery( "Preimplementations.FindAllInactivePreimplementation" ) ;
			List< TblPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblPreimplementacion >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPreimplementacion >( ) ;
		}
	}
	
	public static List< TblPreimplementacion > getAllPreimplementations( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 243 ) ;
			
			Query q = em.createNamedQuery( "Preimplementations.FindAllPreimplementation" ) ;
			List< TblPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblPreimplementacion >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPreimplementacion >( ) ;
		}
	}
        
        public static List< TblPreimplementacion > getAllPreimplementationsWithCampana( int cveCampana )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
						
			Query q = em.createNamedQuery( "Preimplementations.FindAllPreimplementationWithCampaing" ) ;
                        q.setParameter( "cveCampana" , new Integer( cveCampana ) ) ;
			List< TblPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de null
			if( l == null )
				return new ArrayList< TblPreimplementacion >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPreimplementacion >( ) ;
		}
	}
	
	public static boolean throwImplementation( UserLogin user , TblCuenta cuenta , TblAsset asset , int rocitizacion , int pre )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sea null
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.AssetNull" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_ASSETS_EMPTY , 
					null ) ;
		
		// ping( 244 ) ;
		
                TblFlujo flujo = new TblFlujo( ) ;
                TblPreimplementacion plm = new TblPreimplementacion( ) ;                
                if( rocitizacion != 1 )
                {
                    // toma el flujo de implementacion
                    flujo = asset.getTblFlujo1( ) ;
                }else
                {
                    // toma el flujo de Recotizacion
                    flujo = em.find( TblFlujo.class , new Integer( 12 ) ) ;                    
                }
		
		
		// en caso de que el tipo de flujo sea null
		if( flujo == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.AssetImplementationFlowNull" , asset.getNombre( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_ASSET_WITHOUT_FLOW , 
					null ) ;
		
		// toma la primer tarea del flujo
		TblTarea tarea = getFirstWorkInFlow( flujo.getCveFlujo( ) ) ;
		
		// en caso de que sea null
		if( tarea == null )
			// querra decir que no esta bien configurado
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.WrongConfigurationNoFirtWork" , flujo.getNombre( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_FLOW_WITHOUT_FIRST_WORK , 
					null ) ;

		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
                        if( rocitizacion == 1 )
                        {
                            plm = em.find( TblPreimplementacion.class , new Integer( pre ) ) ;
                            plm.setRecotizado( ( byte ) 1 ) ;
                            em.merge( plm ) ;
                            em.flush( ) ;
//                            em.refresh( plm ) ;
                        }
			TblPreimplementacion tblPreimplementacion = new TblPreimplementacion( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			tblPreimplementacion.setBandera( ( byte ) 1 ) ;
			tblPreimplementacion.setFechaAlta( now ) ;
			tblPreimplementacion.setStatus( ( byte ) 1 ) ;
			tblPreimplementacion.setTblFlujo( flujo ) ;
			
			em.persist( tblPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblPreimplementacion ) ;
			
			tblPreimplementacion.getTblAssets( ).add( asset ) ;
			em.persist( tblPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblPreimplementacion ) ;
			
			asset.getTblPreimplementacions( ).add( tblPreimplementacion ) ;
			em.merge( asset ) ;
			em.flush( ) ;
//			em.refresh( asset ) ;
			
			int id = tblPreimplementacion.getCvePreimplementacion( ) ;
			
			// en caso de que si haya primera tarea
			// modificar tbl_tarea_preimpelementacion
			TblTareaPreimplementacion tblTareaPreimplementacion = new TblTareaPreimplementacion( ) ;
			
			// calcula la fecha de activacion de la tarea
			Timestamp fecha = tarea.getFechaActiva( ) ;
			int dias = tarea.getFecActDias( ) ;
			int idFecha = tarea.getFecActFecha( ) ;
			Timestamp fechaFinal = null ;
			
			// en caso de que fecha este en no null
			if( fecha != null )
				fechaFinal = fecha ;
			// en caos de que sea null
			else
			{
				// toma la fecha de la tarea
				java.util.Date fechaRel = null ;
				
				switch( idFecha )
				{
					case 1 :
						fechaRel = asset.getFecha( ) ;
						break ;
					case 2 :
						fechaRel = asset.getFecEntregaBc( ) ;
						break ;
					case 3 :
						fechaRel = asset.getFecAprobBc( ) ;
						break ;
					case 4 :
						fechaRel = asset.getFecLimiteSolCot( ) ;
						break ;
					case 5 :
						fechaRel = asset.getFecLimReqCompra( ) ;
						break ;
					case 6 :
						fechaRel = asset.getFecLimSubeCont( ) ;
						break ;
					case 7 :
						fechaRel = asset.getFecLimPrimFact( ) ;
						break ;
					case 8 :
						fechaRel = asset.getFecConfSede( ) ;
						break ;
					case 9 :
						fechaRel = asset.getFecFinCamp( ) ;
						break ;
					case 10 :
						fechaRel = asset.getFecLimSegFact( ) ;
						break ;
					case 11 :
						fechaRel = asset.getFecLimAgenda( ) ;
						break ;
					case 12 :
						fechaRel = asset.getFecLimGanadores( ) ;
						break ;
					case 13 :
						fechaRel = asset.getFecLimBoletos( ) ;
						break ;
					case 14 :
						fechaRel = asset.getFecSalida( ) ;
						break ;
					case 15 :
						fechaRel = asset.getFecRegreso( ) ;
						break ;
					case 16 :
						fechaRel = asset.getFecEva( ) ;
						break ;
				}
				
				if( fechaRel != null )
				{
					//GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;					
                                        //gc.add( Calendar.DATE , dias ) ;
					Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
                                        //fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
				}
				// en caso de que fechaRel sea igual null
				else
				{
					fechaFinal = null ;
				}
	
			}
			
			tblTareaPreimplementacion.setEjecutado( ( byte ) 2 ) ;
	//			System.out.println( "Fecha de activacion: " + fechaFinal ) ;
			tblTareaPreimplementacion.setFechaActiva( fechaFinal ) ;
			
			fecha = tarea.getFechaLimite( ) ;
			dias = tarea.getFecLimDias( ) ;
			idFecha = tarea.getFecLimFechas( ) ;
			fechaFinal = null ;
			
			// en caso de que fecha este en no null
			if( fecha != null )
				fechaFinal = fecha ;
			// en caos de que sea null
			else
			{
				// toma la fecha de la tarea
				java.util.Date fechaRel = null ;
				
	//				System.out.println( "Id Fecha: " + idFecha ) ;
				switch( idFecha )
				{
					case 1 :
						fechaRel = asset.getFecha( ) ;
						break ;
					case 2 :
						fechaRel = asset.getFecEntregaBc( ) ;
						break ;
					case 3 :
						fechaRel = asset.getFecAprobBc( ) ;
						break ;
					case 4 :
						fechaRel = asset.getFecLimiteSolCot( ) ;
						break ;
					case 5 :
						fechaRel = asset.getFecLimReqCompra( ) ;
						break ;
					case 6 :
						fechaRel = asset.getFecLimSubeCont( ) ;
						break ;
					case 7 :
						fechaRel = asset.getFecLimPrimFact( ) ;
						break ;
					case 8 :
						fechaRel = asset.getFecConfSede( ) ;
						break ;
					case 9 :
						fechaRel = asset.getFecFinCamp( ) ;
						break ;
					case 10 :
						fechaRel = asset.getFecLimSegFact( ) ;
						break ;
					case 11 :
						fechaRel = asset.getFecLimAgenda( ) ;
						break ;
					case 12 :
						fechaRel = asset.getFecLimGanadores( ) ;
						break ;
					case 13 :
						fechaRel = asset.getFecLimBoletos( ) ;
						break ;
					case 14 :
						fechaRel = asset.getFecSalida( ) ;
						break ;
					case 15 :
						fechaRel = asset.getFecRegreso( ) ;
						break ;
					case 16 :
						fechaRel = asset.getFecEva( ) ;
						break ;
				}
				
				if( fechaRel != null )
				{
//					GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//					gc.add( Calendar.DATE , dias ) ;
                                        Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//					fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
				}
				else
				{
					fechaFinal = null ;
				}
	
			}
			
	//			System.out.println( "Fecha limite: " + fechaFinal ) ;
			tblTareaPreimplementacion.setFechaLimite( fechaFinal ) ;
			tblTareaPreimplementacion.setFechaEjecucion( null ) ;
	//			tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
			tblTareaPreimplementacion.setTblUsuario( null ) ;
	//			TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
	//			System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
	//			pk.setCveTarea( firstWork.getCveTarea( ) ) ;
	//			pk.setCveAsset( asset.getCveAsset( ) ) ;
	//			pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
	//			tblTareaPreimplementacion.setId( pk ) ;
			tblTareaPreimplementacion.setTblAsset( asset ) ;
			tblTareaPreimplementacion.setTblTarea( tarea ) ;
			tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
	//			tblTareaPreimplementacion.setTblAsset( asset ) ;
	//			tblTareaPreimplementacion.setTblTarea( firstWork ) ;
			
	//			System.out.println( "*******: " + firstWork ) ;
	//			System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;
			
			// agrega a la base de datos
			em.persist( tblTareaPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblTareaPreimplementacion ) ;
			
	//			System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;
			
			tarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
			em.persist( tblPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblPreimplementacion ) ;
			
			TblCampania campania = tblPreimplementacion.getTblCampania() ;                        
                        // lanza las alarmas de la tarea
			saveScreenWorkAlarmsFlujo( tarea , user , 2 , cuenta , asset , et , campania ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AddingError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_THROW_EXIT , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean throwImplementation( UserLogin user , TblCuenta cuenta , TblAsset asset , EntityTransaction et )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sea null
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.AssetNull" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_ASSETS_EMPTY , 
					null ) ;
		
		// ping( 245 ) ;
		
		// toma el flujo de implementacion
		TblFlujo flujo = asset.getTblFlujo1( ) ;
		
		// en caso de que el tipo de flujo sea null
		if( flujo == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.AssetImplementationFlowNull" , asset.getNombre( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_ASSET_WITHOUT_FLOW , 
					null ) ;
		
		// toma la primer tarea del flujo
		TblTarea tarea = getFirstWorkInFlow( flujo.getCveFlujo( ) ) ;
		
		// en caso de que sea null
		if( tarea == null )
			// querra decir que no esta bien configurado
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.WrongConfigurationNoFirtWork" , flujo.getNombre( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_FLOW_WITHOUT_FIRST_WORK , 
					null ) ;

		try
		{
			TblPreimplementacion tblPreimplementacion = new TblPreimplementacion( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			tblPreimplementacion.setBandera( ( byte ) 1 ) ;
			tblPreimplementacion.setFechaAlta( now ) ;
			tblPreimplementacion.setStatus( ( byte ) 1 ) ;
			tblPreimplementacion.setTblFlujo( flujo ) ;
			
			em.merge( tblPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblPreimplementacion ) ;
			
			tblPreimplementacion.getTblAssets( ).add( asset ) ;
			em.merge( tblPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblPreimplementacion ) ;
			
			asset.getTblPreimplementacions( ).add( tblPreimplementacion ) ;
			em.merge( asset ) ;
			em.flush( ) ;
//			em.refresh( asset ) ;
			
			int id = tblPreimplementacion.getCvePreimplementacion( ) ;
			
			// en caso de que si haya primera tarea
			// modificar tbl_tarea_preimpelementacion
			TblTareaPreimplementacion tblTareaPreimplementacion = new TblTareaPreimplementacion( ) ;
			
			// calcula la fecha de activacion de la tarea
			Timestamp fecha = tarea.getFechaActiva( ) ;
			int dias = tarea.getFecActDias( ) ;
			int idFecha = tarea.getFecActFecha( ) ;
			Timestamp fechaFinal = null ;
			
			// en caso de que fecha este en no null
			if( fecha != null )
				fechaFinal = fecha ;
			// en caos de que sea null
			else
			{
				// toma la fecha de la tarea
				java.util.Date fechaRel = null ;
				
				switch( idFecha )
				{
					case 1 :
						fechaRel = asset.getFecha( ) ;
						break ;
					case 2 :
						fechaRel = asset.getFecEntregaBc( ) ;
						break ;
					case 3 :
						fechaRel = asset.getFecAprobBc( ) ;
						break ;
					case 4 :
						fechaRel = asset.getFecLimiteSolCot( ) ;
						break ;
					case 5 :
						fechaRel = asset.getFecLimReqCompra( ) ;
						break ;
					case 6 :
						fechaRel = asset.getFecLimSubeCont( ) ;
						break ;
					case 7 :
						fechaRel = asset.getFecLimPrimFact( ) ;
						break ;
					case 8 :
						fechaRel = asset.getFecConfSede( ) ;
						break ;
					case 9 :
						fechaRel = asset.getFecFinCamp( ) ;
						break ;
					case 10 :
						fechaRel = asset.getFecLimSegFact( ) ;
						break ;
					case 11 :
						fechaRel = asset.getFecLimAgenda( ) ;
						break ;
					case 12 :
						fechaRel = asset.getFecLimGanadores( ) ;
						break ;
					case 13 :
						fechaRel = asset.getFecLimBoletos( ) ;
						break ;
					case 14 :
						fechaRel = asset.getFecSalida( ) ;
						break ;
					case 15 :
						fechaRel = asset.getFecRegreso( ) ;
						break ;
					case 16 :
						fechaRel = asset.getFecEva( ) ;
						break ;
				}
				
				if( fechaRel != null )
				{
//					GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//					gc.add( Calendar.DATE , dias ) ;
                                        Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//					fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
				}
				// en caso de que fechaRel sea igual null
				else
				{
					fechaFinal = null ;
				}
	
			}
			
			tblTareaPreimplementacion.setEjecutado( ( byte ) 2 ) ;
	//			System.out.println( "Fecha de activacion: " + fechaFinal ) ;
			tblTareaPreimplementacion.setFechaActiva( fechaFinal ) ;
			
			fecha = tarea.getFechaLimite( ) ;
			dias = tarea.getFecLimDias( ) ;
			idFecha = tarea.getFecLimFechas( ) ;
			fechaFinal = null ;
			
			// en caso de que fecha este en no null
			if( fecha != null )
				fechaFinal = fecha ;
			// en caos de que sea null
			else
			{
				// toma la fecha de la tarea
				java.util.Date fechaRel = null ;
				
	//				System.out.println( "Id Fecha: " + idFecha ) ;
				switch( idFecha )
				{
					case 1 :
						fechaRel = asset.getFecha( ) ;
						break ;
					case 2 :
						fechaRel = asset.getFecEntregaBc( ) ;
						break ;
					case 3 :
						fechaRel = asset.getFecAprobBc( ) ;
						break ;
					case 4 :
						fechaRel = asset.getFecLimiteSolCot( ) ;
						break ;
					case 5 :
						fechaRel = asset.getFecLimReqCompra( ) ;
						break ;
					case 6 :
						fechaRel = asset.getFecLimSubeCont( ) ;
						break ;
					case 7 :
						fechaRel = asset.getFecLimPrimFact( ) ;
						break ;
					case 8 :
						fechaRel = asset.getFecConfSede( ) ;
						break ;
					case 9 :
						fechaRel = asset.getFecFinCamp( ) ;
						break ;
					case 10 :
						fechaRel = asset.getFecLimSegFact( ) ;
						break ;
					case 11 :
						fechaRel = asset.getFecLimAgenda( ) ;
						break ;
					case 12 :
						fechaRel = asset.getFecLimGanadores( ) ;
						break ;
					case 13 :
						fechaRel = asset.getFecLimBoletos( ) ;
						break ;
					case 14 :
						fechaRel = asset.getFecSalida( ) ;
						break ;
					case 15 :
						fechaRel = asset.getFecRegreso( ) ;
						break ;
					case 16 :
						fechaRel = asset.getFecEva( ) ;
						break ;
				}
				
				if( fechaRel != null )
				{
//					GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//					gc.add( Calendar.DATE , dias ) ;
                                        Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//					fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
				}
				else
				{
					fechaFinal = null ;
				}
	
			}
			
	//			System.out.println( "Fecha limite: " + fechaFinal ) ;
			tblTareaPreimplementacion.setFechaLimite( fechaFinal ) ;
			tblTareaPreimplementacion.setFechaEjecucion( null ) ;
	//			tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
			tblTareaPreimplementacion.setTblUsuario( null ) ;
	//			TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
	//			System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
	//			pk.setCveTarea( firstWork.getCveTarea( ) ) ;
	//			pk.setCveAsset( asset.getCveAsset( ) ) ;
	//			pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
	//			tblTareaPreimplementacion.setId( pk ) ;
			tblTareaPreimplementacion.setTblAsset( asset ) ;
			tblTareaPreimplementacion.setTblTarea( tarea ) ;
			tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
	//			tblTareaPreimplementacion.setTblAsset( asset ) ;
	//			tblTareaPreimplementacion.setTblTarea( firstWork ) ;
			
	//			System.out.println( "*******: " + firstWork ) ;
	//			System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;
			
			// agrega a la base de datos
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
			
	//			System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;
			
			tarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
			em.merge( tblPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblPreimplementacion ) ;
			
			TblCampania campania = tblPreimplementacion.getTblCampania() ; 
                        // lanza las alarmas de la tarea
			saveScreenWorkAlarmsFlujo( tarea , user , 2 , cuenta , asset , et , campania ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AddingError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_THROW_EXIT , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean throwCampaign( UserLogin user , TblAsset asset )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sea null
		if( asset == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.AssetNull" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_ASSETS_EMPTY , 
					null ) ;
		
		// ping( 246 ) ;
		
		// toma el flujo de implementacion
		TblFlujo flujo = asset.getTblFlujo2( ) ;
		
		// toma la primer tarea del flujo
		TblTarea tarea = getFirstWorkInFlow( flujo.getCveFlujo( ) ) ;
		
		// en caso de que sea null
		if( tarea == null )
			// querra decir que no esta bien configurado
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.WrongConfigurationNoFirtWork" , flujo.getNombre( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_FLOW_WITHOUT_FIRST_WORK , 
					null ) ;

		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			TblPreimplementacion tblPreimplementacion = new TblPreimplementacion( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			tblPreimplementacion.setBandera( ( byte ) 1 ) ;
			tblPreimplementacion.setFechaAlta( now ) ;
			tblPreimplementacion.setStatus( ( byte ) 1 ) ;
			tblPreimplementacion.setTblFlujo( flujo ) ;
			
			em.persist( tblPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblPreimplementacion ) ;
			
			int id = tblPreimplementacion.getCvePreimplementacion( ) ;
			
			// en caso de que si haya primera tarea
			// modificar tbl_tarea_preimpelementacion
			TblTareaPreimplementacion tblTareaPreimplementacion = new TblTareaPreimplementacion( ) ;
			
			// calcula la fecha de activacion de la tarea
			Timestamp fecha = tarea.getFechaActiva( ) ;
			int dias = tarea.getFecActDias( ) ;
			int idFecha = tarea.getFecActFecha( ) ;
			Timestamp fechaFinal = null ;
			
			// en caso de que fecha este en no null
			if( fecha != null )
				fechaFinal = fecha ;
			// en caos de que sea null
			else
			{
				// toma la fecha de la tarea
				java.util.Date fechaRel = null ;
				
				switch( idFecha )
				{
					case 1 :
						fechaRel = asset.getFecha( ) ;
						break ;
					case 2 :
						fechaRel = asset.getFecEntregaBc( ) ;
						break ;
					case 3 :
						fechaRel = asset.getFecAprobBc( ) ;
						break ;
					case 4 :
						fechaRel = asset.getFecLimiteSolCot( ) ;
						break ;
					case 5 :
						fechaRel = asset.getFecLimReqCompra( ) ;
						break ;
					case 6 :
						fechaRel = asset.getFecLimSubeCont( ) ;
						break ;
					case 7 :
						fechaRel = asset.getFecLimPrimFact( ) ;
						break ;
					case 8 :
						fechaRel = asset.getFecConfSede( ) ;
						break ;
					case 9 :
						fechaRel = asset.getFecFinCamp( ) ;
						break ;
					case 10 :
						fechaRel = asset.getFecLimSegFact( ) ;
						break ;
					case 11 :
						fechaRel = asset.getFecLimAgenda( ) ;
						break ;
					case 12 :
						fechaRel = asset.getFecLimGanadores( ) ;
						break ;
					case 13 :
						fechaRel = asset.getFecLimBoletos( ) ;
						break ;
					case 14 :
						fechaRel = asset.getFecSalida( ) ;
						break ;
					case 15 :
						fechaRel = asset.getFecRegreso( ) ;
						break ;
					case 16 :
						fechaRel = asset.getFecEva( ) ;
						break ;
				}
				
				if( fechaRel != null )
				{
//					GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//					gc.add( Calendar.DATE , dias ) ;
                                    Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//					fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
				}
				else
					fechaFinal = null ;
				
			}
			
			tblTareaPreimplementacion.setEjecutado( ( byte ) 2 ) ;
	//			System.out.println( "Fecha de activacion: " + fechaFinal ) ;
			tblTareaPreimplementacion.setFechaActiva( fechaFinal ) ;
			
			fecha = tarea.getFechaLimite( ) ;
			dias = tarea.getFecLimDias( ) ;
			idFecha = tarea.getFecLimFechas( ) ;
			fechaFinal = null ;
			
			// en caso de que fecha este en no null
			if( fecha != null )
				fechaFinal = fecha ;
			// en caos de que sea null
			else
			{
				// toma la fecha de la tarea
				java.util.Date fechaRel = null ;
				
	//				System.out.println( "Id Fecha: " + idFecha ) ;
				switch( idFecha )
				{
					case 1 :
						fechaRel = asset.getFecha( ) ;
						break ;
					case 2 :
						fechaRel = asset.getFecEntregaBc( ) ;
						break ;
					case 3 :
						fechaRel = asset.getFecAprobBc( ) ;
						break ;
					case 4 :
						fechaRel = asset.getFecLimiteSolCot( ) ;
						break ;
					case 5 :
						fechaRel = asset.getFecLimReqCompra( ) ;
						break ;
					case 6 :
						fechaRel = asset.getFecLimSubeCont( ) ;
						break ;
					case 7 :
						fechaRel = asset.getFecLimPrimFact( ) ;
						break ;
					case 8 :
						fechaRel = asset.getFecConfSede( ) ;
						break ;
					case 9 :
						fechaRel = asset.getFecFinCamp( ) ;
						break ;
					case 10 :
						fechaRel = asset.getFecLimSegFact( ) ;
						break ;
					case 11 :
						fechaRel = asset.getFecLimAgenda( ) ;
						break ;
					case 12 :
						fechaRel = asset.getFecLimGanadores( ) ;
						break ;
					case 13 :
						fechaRel = asset.getFecLimBoletos( ) ;
						break ;
					case 14 :
						fechaRel = asset.getFecSalida( ) ;
						break ;
					case 15 :
						fechaRel = asset.getFecRegreso( ) ;
						break ;
					case 16 :
						fechaRel = asset.getFecEva( ) ;
						break ;
				}
				
				if( fechaRel != null )
				{
//					GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//					gc.add( Calendar.DATE , dias ) ;
                                    Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//					fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
				}
				else
					fechaFinal = null ;
	
			}
			
	//			System.out.println( "Fecha limite: " + fechaFinal ) ;
			tblTareaPreimplementacion.setFechaLimite( fechaFinal ) ;
			tblTareaPreimplementacion.setFechaEjecucion( null ) ;
	//			tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
			tblTareaPreimplementacion.setTblUsuario( null ) ;
	//			TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
	//			System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
	//			pk.setCveTarea( firstWork.getCveTarea( ) ) ;
	//			pk.setCveAsset( asset.getCveAsset( ) ) ;
	//			pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
	//			tblTareaPreimplementacion.setId( pk ) ;
			tblTareaPreimplementacion.setTblAsset( asset ) ;
			tblTareaPreimplementacion.setTblTarea( tarea ) ;
			tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
	//			tblTareaPreimplementacion.setTblAsset( asset ) ;
	//			tblTareaPreimplementacion.setTblTarea( firstWork ) ;
			
	//			System.out.println( "*******: " + firstWork ) ;
	//			System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;
			
			// agrega a la base de datos
			em.persist( tblTareaPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblTareaPreimplementacion ) ;
			
	//			System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;
			
			tarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
			em.merge( tarea ) ;
			em.flush( ) ;
//			em.refresh( tarea ) ;
			
			tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
			em.persist( tblPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblPreimplementacion ) ;
			
			TblCampania campania = tblPreimplementacion.getTblCampania() ;
                        // lanza las alarmas de la tarea
			saveScreenWorkAlarms( tarea , user , 3 , null , asset , et , campania ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AddingError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_THROW_EXIT , 
					e ) ;
		}
		
		return true ;
	}
	
	public static boolean throwCampaign( UserLogin user , TblCampania campania , TblFlujoAutorizacion fluAut , EntityTransaction et )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de que sea null
		if( campania == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.CampaniaNull" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_ASSETS_EMPTY , 
					null ) ;
		
		try
		{
			// ping( 247 ) ;
			
			// assets ya lanzados
			List< TblAsset > assetLanzado = new ArrayList< TblAsset >( ) ;
                        
                        List< TblPreimplementacion > tblPreimplementacionES = new ArrayList < TblPreimplementacion >( ) ;
			
			// toma los assets de la campania
			List< TblPaquete > paquetes = campania.getTblPaquetes( ) ;
			
			System.out.println( "MasterCardDAO.java: throwCampaign: cantidad Paquetes/" + paquetes.size( ) ) ;
			// empieza a insertar en TblPreimplementacion
			// recorre los paquetes
			for( TblPaquete paq : paquetes )
			{
				System.out.println( "MasterCardDAO.java: throwCampaign: paquetes/" + paq.getCvePaquete( ) ) ;
				
				// toma el asset de cada paquete
				TblAsset asset = paq.getTblAsset( ) ;
				
				boolean noLanzado = true ;
				
				// verifica si se encuentra en el assetLanzado
				for( TblAsset a : assetLanzado )
				{
					// en caso de que si se encuentre, que sean iguales las cve
					if( a.getCveAsset( ) == asset.getCveAsset( ) )
					{
						noLanzado = false ;
						
						// rompe el ciclo
						break ;
					}
				}
				
				// en caso de qwue no haya sido lanzado
				if( noLanzado )
				{
					// lo marca como lanzado
					assetLanzado.add( asset ) ;
					
					// toma el flujo al que esta relacionado el asset
					TblFlujo flujo = asset.getTblFlujo2( ) ;
					
					// en caso de que sea null, es decir, que no tenga el flujo
					if( flujo == null )
						// lanza excepcion
						throw new MasterCardException( 
										MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.AssetWithoutCampaignFlow" ) , 
										MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_ASSET_WITHOUT_FLOW , 
										null ) ;
					
					// toma la primer tarea del flujo
					TblTarea tarea = getFirstWorkInFlow( flujo.getCveFlujo( ) ) ;
					
					// crea el flujo en tbl_preimplementacion
					
					TblPreimplementacion tblPreimplementacion = new TblPreimplementacion( ) ;
					
					Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
					
					tblPreimplementacion.setBandera( ( byte ) 1 ) ;
					tblPreimplementacion.setFechaAlta( now ) ;
					tblPreimplementacion.setStatus( ( byte ) 1 ) ;
					tblPreimplementacion.setTblFlujo( flujo ) ;
					tblPreimplementacion.setTblCampania( campania ) ;
					
					em.persist( tblPreimplementacion ) ;
					em.flush( ) ;
					em.refresh( tblPreimplementacion ) ;
                                        
                                        //Agrega registros para microflujo TblPreimpementacionFlujosautRoles
                                        List<TblAutorizacionesRoles> listAutRol = new ArrayList<TblAutorizacionesRoles>( ) ;
                                        int orden = 0 ;
                                        TblAutorizacionesRoles autRol = null ;
                                        listAutRol = getRolesAutById( fluAut.getCveFlujoAut( ) ) ;
                        
                                        for( TblAutorizacionesRoles lAR : listAutRol ) {
                                            autRol = lAR ;
                                            orden = autRol.getOrden( ) + 1 ;
                                            
                                            TblPreimplementacionFlujoautRoles tblPreimplementacionFlujoautRoles = new TblPreimplementacionFlujoautRoles( ) ;

                                            tblPreimplementacionFlujoautRoles.setTblPreimplementacion( tblPreimplementacion ) ;
                                            tblPreimplementacionFlujoautRoles.setTblAutorizacionesRoles( autRol ) ;
                                            tblPreimplementacionFlujoautRoles.setTblRole( autRol.getTblRoles( ) ) ;
                                            tblPreimplementacionFlujoautRoles.setOrden( autRol.getOrden( ) ) ;
                                            tblPreimplementacionFlujoautRoles.setEjecucion( "NO" ) ;
                                            em.persist( tblPreimplementacionFlujoautRoles ) ;
                                            em.flush( ) ;
                                            em.refresh( tblPreimplementacionFlujoautRoles ) ;

                                        }
                                        if( campania.getAutorizaCountryM( ) == 1 ) {
                                            TblRole role = em.find( TblRole.class , new Integer( 8 ) ) ;
                                            TblPreimplementacionFlujoautRoles tblPreimplementacionFlujoautRoles = new TblPreimplementacionFlujoautRoles( ) ;

                                            tblPreimplementacionFlujoautRoles.setTblPreimplementacion( tblPreimplementacion ) ;
                                            tblPreimplementacionFlujoautRoles.setTblAutorizacionesRoles( autRol ) ;
                                            tblPreimplementacionFlujoautRoles.setTblRole( role ) ;
                                            tblPreimplementacionFlujoautRoles.setOrden( orden ) ;
                                            tblPreimplementacionFlujoautRoles.setEjecucion( "NO" ) ;
                                            em.persist( tblPreimplementacionFlujoautRoles ) ;
                                            em.flush( ) ;
                                            em.refresh( tblPreimplementacionFlujoautRoles ) ;
                                            
                                        }
					
					// actualiza la campania
					campania.getTblPreimplementacions( ).add( tblPreimplementacion ) ;
					em.merge( campania ) ;
					em.flush( ) ;
//					em.refresh( campania ) ;
					
					// agrega el asset
					tblPreimplementacion.getTblAssets( ).add( asset ) ;
					em.persist( tblPreimplementacion ) ;
					em.flush( ) ;
					em.refresh( tblPreimplementacion ) ;
					
					asset.getTblPreimplementacions( ).add( tblPreimplementacion ) ;
					em.persist( asset ) ;
					em.flush( ) ;
					em.refresh( asset ) ;
                                tblPreimplementacionES.add( tblPreimplementacion ) ;
                                }
                                
                        }// termina de insertar en TblPreimplementacion
					
                        TblPreimplementacion tblPreimplementacion = new TblPreimplementacion( ) ;
                        TblAsset asset = new TblAsset( ) ;
                        
                        java.util.Date fecMenor = null ;
                        for ( TblPreimplementacion tp : tblPreimplementacionES )
                        {
                            List< TblAsset >  aset = tp.getTblAssets( ) ;

                            for ( TblAsset a : aset )
                            {
                                                               
                                if ( fecMenor == null )
                                {
                                    fecMenor = a.getFecAprobBc( ) ;
                                    tblPreimplementacion = tp ;
                                    asset = a ;

                                }else
                                    if ( fecMenor.after( a.getFecEntregaBc( ) ) )
                                    {
                                        fecMenor.equals( a.getFecEntregaBc( ) ) ;
                                        //  limpia la lista
                                        tblPreimplementacion = tp ;
                                        asset = a ;

                                    }                
                            }
                        }
                        
//                        // recorre los paquetes para empezar a insertar en TblTareaPreimplementacion
//			for( TblPaquete paq : paquetes )
//			{
//				System.out.println( "MasterCardDAO.java: throwCampaign: paquetes/" + paq.getCvePaquete( ) ) ;
//				
//				// toma el asset de cada paquete
//				TblAsset asset = paq.getTblAsset( ) ;
//				
//				boolean noLanzado = true ;
//				
//				// verifica si se encuentra en el assetLanzado
//				for( TblAsset a : assetLanzado )
//				{
//					// en caso de que si se encuentre, que sean iguales las cve
//					if( a.getCveAsset( ) == asset.getCveAsset( ) )
//					{
//						noLanzado = false ;
//						
//						// rompe el ciclo
//						break ;
//					}
//				}
//				
//				// en caso de qwue no haya sido lanzado
//				if( noLanzado )
//				{
//					// lo marca como lanzado
//					assetLanzado.add( asset ) ;
//					
					// toma el flujo al que esta relacionado el asset
					TblFlujo flujo = asset.getTblFlujo2( ) ;
					
					// en caso de que sea null, es decir, que no tenga el flujo
					if( flujo == null )
						// lanza excepcion
						throw new MasterCardException( 
										MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.add.errors.AssetWithoutCampaignFlow" ) , 
										MCUtil.MASTERCARD_ERROR_CODE_IMPLEMENTATION_ERROR_ASSET_WITHOUT_FLOW , 
										null ) ;
					
					// toma la primer tarea del flujo
					TblTarea tarea = getFirstWorkInFlow( flujo.getCveFlujo( ) ) ;
                                        
					int id = tblPreimplementacion.getCvePreimplementacion( ) ;
                                        boolean tareaRegistrar = true ;
                                        
                                        // verifica si se deve registrar tblTareaPreimplementacion
                                        tareaRegistrar = MismaTarea.disparaTareaUno( tarea , tblPreimplementacion ) ;
					
                                        if ( tareaRegistrar == true ){
                                        
					// en caso de que si haya primera tarea
					// modificar tbl_tarea_preimpelementacion
					TblTareaPreimplementacion tblTareaPreimplementacion = new TblTareaPreimplementacion( ) ;
					
					// calcula la fecha de activacion de la tarea
					Timestamp fecha = tarea.getFechaActiva( ) ;
					int dias = tarea.getFecActDias( ) ;
					int idFecha = tarea.getFecActFecha( ) ;
					Timestamp fechaFinal = null ;
					
					// en caso de que fecha este en no null
					if( fecha != null )
						fechaFinal = fecha ;
					// en caos de que sea null
					else
					{
						// toma la fecha de la tarea
						java.util.Date fechaRel = null ;
						
						switch( idFecha )
						{
							case 1 :
								fechaRel = asset.getFecha( ) ;
								break ;
							case 2 :
								fechaRel = asset.getFecEntregaBc( ) ;
								break ;
							case 3 :
								fechaRel = asset.getFecAprobBc( ) ;
								break ;
							case 4 :
								fechaRel = asset.getFecLimiteSolCot( ) ;
								break ;
							case 5 :
								fechaRel = asset.getFecLimReqCompra( ) ;
								break ;
							case 6 :
								fechaRel = asset.getFecLimSubeCont( ) ;
								break ;
							case 7 :
								fechaRel = asset.getFecLimPrimFact( ) ;
								break ;
							case 8 :
								fechaRel = asset.getFecConfSede( ) ;
								break ;
							case 9 :
								fechaRel = asset.getFecFinCamp( ) ;
								break ;
							case 10 :
								fechaRel = asset.getFecLimSegFact( ) ;
								break ;
							case 11 :
								fechaRel = asset.getFecLimAgenda( ) ;
								break ;
							case 12 :
								fechaRel = asset.getFecLimGanadores( ) ;
								break ;
							case 13 :
								fechaRel = asset.getFecLimBoletos( ) ;
								break ;
							case 14 :
								fechaRel = asset.getFecSalida( ) ;
								break ;
							case 15 :
								fechaRel = asset.getFecRegreso( ) ;
								break ;
							case 16 :
								fechaRel = asset.getFecEva( ) ;
								break ;
						}
						
						if( fechaRel != null )
						{
//							GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//							gc.add( Calendar.DATE , dias ) ;
                                                    Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//							fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
						}
						else
							fechaFinal = null ;
			
					}
					
					tblTareaPreimplementacion.setEjecutado( ( byte ) 2 ) ;
			//			System.out.println( "Fecha de activacion: " + fechaFinal ) ;
					tblTareaPreimplementacion.setFechaActiva( fechaFinal ) ;
					
					fecha = tarea.getFechaLimite( ) ;
					dias = tarea.getFecLimDias( ) ;
					idFecha = tarea.getFecLimFechas( ) ;
					fechaFinal = null ;
					
					// en caso de que fecha este en no null
					if( fecha != null )
						fechaFinal = fecha ;
					// en caos de que sea null
					else
					{
						// toma la fecha de la tarea
						java.util.Date fechaRel = null ;
						
			//				System.out.println( "Id Fecha: " + idFecha ) ;
						switch( idFecha )
						{
							case 1 :
								fechaRel = asset.getFecha( ) ;
								break ;
							case 2 :
								fechaRel = asset.getFecEntregaBc( ) ;
								break ;
							case 3 :
								fechaRel = asset.getFecAprobBc( ) ;
								break ;
							case 4 :
								fechaRel = asset.getFecLimiteSolCot( ) ;
								break ;
							case 5 :
								fechaRel = asset.getFecLimReqCompra( ) ;
								break ;
							case 6 :
								fechaRel = asset.getFecLimSubeCont( ) ;
								break ;
							case 7 :
								fechaRel = asset.getFecLimPrimFact( ) ;
								break ;
							case 8 :
								fechaRel = asset.getFecConfSede( ) ;
								break ;
							case 9 :
								fechaRel = asset.getFecFinCamp( ) ;
								break ;
							case 10 :
								fechaRel = asset.getFecLimSegFact( ) ;
								break ;
							case 11 :
								fechaRel = asset.getFecLimAgenda( ) ;
								break ;
							case 12 :
								fechaRel = asset.getFecLimGanadores( ) ;
								break ;
							case 13 :
								fechaRel = asset.getFecLimBoletos( ) ;
								break ;
							case 14 :
								fechaRel = asset.getFecSalida( ) ;
								break ;
							case 15 :
								fechaRel = asset.getFecRegreso( ) ;
								break ;
							case 16 :
								fechaRel = asset.getFecEva( ) ;
								break ;
						}
						
						if( fechaRel != null )
						{
//							GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//							gc.add( Calendar.DATE , dias ) ;
                                                    Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//							fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
						}
						else
							fechaFinal = null ;
			
					}
					
			//			System.out.println( "Fecha limite: " + fechaFinal ) ;
					tblTareaPreimplementacion.setFechaLimite( fechaFinal ) ;
					tblTareaPreimplementacion.setFechaEjecucion( null ) ;
			//			tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
					tblTareaPreimplementacion.setTblUsuario( null ) ;
			//			TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
			//			System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
			//			pk.setCveTarea( firstWork.getCveTarea( ) ) ;
			//			pk.setCveAsset( asset.getCveAsset( ) ) ;
			//			pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
			//			tblTareaPreimplementacion.setId( pk ) ;
					tblTareaPreimplementacion.setTblAsset( asset ) ;
					tblTareaPreimplementacion.setTblTarea( tarea ) ;
					tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
			//			tblTareaPreimplementacion.setTblAsset( asset ) ;
			//			tblTareaPreimplementacion.setTblTarea( firstWork ) ;
					
			//			System.out.println( "*******: " + firstWork ) ;
			//			System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;
					
					// agrega a la base de datos
					em.persist( tblTareaPreimplementacion ) ;
					em.flush( ) ;
					em.refresh( tblTareaPreimplementacion ) ;
					
			//			System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;
					
					tarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
					em.merge( tarea ) ;
					em.flush( ) ;
//					em.refresh( tarea ) ;
					
					tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
					em.persist( tblPreimplementacion ) ;
					em.flush( ) ;
					em.refresh( tblPreimplementacion ) ;
                                        
                                                                                
                                        // lanza las alarmas de la tarea
					saveScreenWorkAlarms( tarea , user , 3 , null , asset , et , campania ) ;
                                        
                                        }// termina if que verifica si de registra la tblTareaPreimplementacion
					
					
//				}// termina if de asset no lanzado
//				sdfg
//			}// termina for para recorrer paquetes
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AddingError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_THROW_EXIT , 
					e ) ;
		}
		
		return true ;
	}

	public static boolean throwPreimplementation( UserLogin user , TblCuenta cuenta , int[ ] assets , int cveFlujo )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de nombre nulo
		if( cveFlujo < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.CveFlujoWrong" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_FLOW_EMPTY , 
					null ) ;
		
		// ping( 248 ) ;
		
		// busca la forma
		TblFlujo flujo = em.find( TblFlujo.class , new Integer( cveFlujo ) ) ;
		
		// en caso de nombre nulo
		if( assets == null || assets.length == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AssetsEmpty" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_ASSETS_EMPTY , 
					null ) ;
		
		List< TblAsset > assetsList = new ArrayList< TblAsset >( ) ;
		
		for( int asset : assets )
		{
			TblAsset ass = findAssetById( asset ) ;
			
			if( ass == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AssetsIdNotExist" , asset ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_ASSETS_WRONG , 
						null ) ;
			
			// en caso d eque se pueda agregar
			assetsList.add( ass ) ;
		}
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			// agrega a tabla tbl_flujo_implementacion
			TblPreimplementacion tblPreimplementacion = new TblPreimplementacion( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			tblPreimplementacion.setBandera( ( byte ) 1 ) ;
			tblPreimplementacion.setFechaAlta( now ) ;
			tblPreimplementacion.setStatus( ( byte ) 1 ) ;
			tblPreimplementacion.setTblFlujo( flujo ) ;
			
			em.persist( tblPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblPreimplementacion ) ;
			
			int id = tblPreimplementacion.getCvePreimplementacion( ) ;
//			System.out.println( "Id Nuevo: " + id ) ;
			
			// agrega los assets
			for( TblAsset asset : assetsList )
			{
				// agrega
				tblPreimplementacion.getTblAssets( ).add( asset ) ;
				
				asset.getTblPreimplementacions().add( tblPreimplementacion ) ;
				em.merge( asset ) ;
				em.flush( ) ;
//				em.refresh( asset ) ;
			}
			
			em.persist( tblPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblPreimplementacion ) ;
			
			System.out.println( "ThrowPreimplementation: " + cveFlujo ) ;
			
			List< TblTarea > tareas = getAllActiveTareasWithFlow( cveFlujo ) ;
			
			if( tareas == null || tareas.size( ) == 0 )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.FlowWithoutWorks" , flujo.getNombre( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_FLOW_WITHOUT_WORKS , 
						null ) ;
				
			System.out.println( "ThrowPreimplementation: #Tareas/" + tareas.size( ) ) ;
			
			// obtiene la tarea inicial del flujo
			TblTarea firstWork = getFirstWorkInFlow( cveFlujo ) ;
			
			if( firstWork == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.FlowNotHaveFirstWork" , flujo.getNombre( ) ) , 
						MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_FLOW_WITHOUT_FIRST_WORK , 
						null ) ;
			
			TblAsset asset = assetsList.get( 0 ) ;
			
			// recorer los assets
			// modificar tbl_tarea_preimpelementacion
			TblTareaPreimplementacion tblTareaPreimplementacion = new TblTareaPreimplementacion( ) ;
			
			// calcula la fecha de activacion de la tarea
			Timestamp fecha = firstWork.getFechaActiva( ) ;
			int dias = firstWork.getFecActDias( ) ;
			int idFecha = firstWork.getFecActFecha( ) ;
			Timestamp fechaFinal = null ;
			
			// en caso de que fecha este en no null
			if( fecha != null )
				fechaFinal = fecha ;
			// en caos de que sea null
			else
			{
				// toma la fecha de la tarea
				java.util.Date fechaRel = null ;
				
				switch( idFecha )
				{
					case 1 :
						fechaRel = asset.getFecha( ) ;
						break ;
					case 2 :
						fechaRel = asset.getFecEntregaBc( ) ;
						break ;
					case 3 :
						fechaRel = asset.getFecAprobBc( ) ;
						break ;
					case 4 :
						fechaRel = asset.getFecLimiteSolCot( ) ;
						break ;
					case 5 :
						fechaRel = asset.getFecLimReqCompra( ) ;
						break ;
					case 6 :
						fechaRel = asset.getFecLimSubeCont( ) ;
						break ;
					case 7 :
						fechaRel = asset.getFecLimPrimFact( ) ;
						break ;
					case 8 :
						fechaRel = asset.getFecConfSede( ) ;
						break ;
					case 9 :
						fechaRel = asset.getFecFinCamp( ) ;
						break ;
					case 10 :
						fechaRel = asset.getFecLimSegFact( ) ;
						break ;
					case 11 :
						fechaRel = asset.getFecLimAgenda( ) ;
						break ;
					case 12 :
						fechaRel = asset.getFecLimGanadores( ) ;
						break ;
					case 13 :
						fechaRel = asset.getFecLimBoletos( ) ;
						break ;
					case 14 :
						fechaRel = asset.getFecSalida( ) ;
						break ;
					case 15 :
						fechaRel = asset.getFecRegreso( ) ;
						break ;
					case 16 :
						fechaRel = asset.getFecEva( ) ;
						break ;
				}
				
				if( fechaRel != null )
				{
//					GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//					gc.add( Calendar.DATE , dias ) ;
                                    Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//					fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
				}

			}
			
			tblTareaPreimplementacion.setEjecutado( ( byte ) 2 ) ;
//				System.out.println( "Fecha de activacion: " + fechaFinal ) ;
			tblTareaPreimplementacion.setFechaActiva( fechaFinal ) ;
			
			fecha = firstWork.getFechaLimite( ) ;
			dias = firstWork.getFecLimDias( ) ;
			idFecha = firstWork.getFecLimFechas( ) ;
			fechaFinal = null ;
			
			// en caso de que fecha este en no null
			if( fecha != null )
				fechaFinal = fecha ;
			// en caos de que sea null
			else
			{
				// toma la fecha de la tarea
				java.util.Date fechaRel = null ;
				
//					System.out.println( "Id Fecha: " + idFecha ) ;
				switch( idFecha )
				{
					case 1 :
						fechaRel = asset.getFecha( ) ;
						break ;
					case 2 :
						fechaRel = asset.getFecEntregaBc( ) ;
						break ;
					case 3 :
						fechaRel = asset.getFecAprobBc( ) ;
						break ;
					case 4 :
						fechaRel = asset.getFecLimiteSolCot( ) ;
						break ;
					case 5 :
						fechaRel = asset.getFecLimReqCompra( ) ;
						break ;
					case 6 :
						fechaRel = asset.getFecLimSubeCont( ) ;
						break ;
					case 7 :
						fechaRel = asset.getFecLimPrimFact( ) ;
						break ;
					case 8 :
						fechaRel = asset.getFecConfSede( ) ;
						break ;
					case 9 :
						fechaRel = asset.getFecFinCamp( ) ;
						break ;
					case 10 :
						fechaRel = asset.getFecLimSegFact( ) ;
						break ;
					case 11 :
						fechaRel = asset.getFecLimAgenda( ) ;
						break ;
					case 12 :
						fechaRel = asset.getFecLimGanadores( ) ;
						break ;
					case 13 :
						fechaRel = asset.getFecLimBoletos( ) ;
						break ;
					case 14 :
						fechaRel = asset.getFecSalida( ) ;
						break ;
					case 15 :
						fechaRel = asset.getFecRegreso( ) ;
						break ;
					case 16 :
						fechaRel = asset.getFecEva( ) ;
						break ;
				}
				
				if( fechaRel != null )
				{
//					GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//					gc.add( Calendar.DATE , dias ) ;
                                    Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//					fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
				}

			}
			
//				System.out.println( "Fecha limite: " + fechaFinal ) ;
			tblTareaPreimplementacion.setFechaLimite( fechaFinal ) ;
			tblTareaPreimplementacion.setFechaEjecucion( null ) ;
//				tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
			tblTareaPreimplementacion.setTblUsuario( null ) ;
//				TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
//				System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
//				pk.setCveTarea( firstWork.getCveTarea( ) ) ;
//				pk.setCveAsset( asset.getCveAsset( ) ) ;
//				pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
//				tblTareaPreimplementacion.setId( pk ) ;
			tblTareaPreimplementacion.setTblAsset( asset ) ;
			tblTareaPreimplementacion.setTblTarea( firstWork ) ;
			tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
//				tblTareaPreimplementacion.setTblAsset( asset ) ;
//				tblTareaPreimplementacion.setTblTarea( firstWork ) ;
			
//				System.out.println( "*******: " + firstWork ) ;
//				System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;
			
			// agrega a la base de datos
			em.persist( tblTareaPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblTareaPreimplementacion ) ;
			
//				System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;
			
			firstWork.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
			em.persist( firstWork ) ;
			em.flush( ) ;
			em.refresh( firstWork ) ;
			
			tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacion ) ;
			em.persist( tblPreimplementacion ) ;
			em.flush( ) ;
			em.refresh( tblPreimplementacion ) ;
			
			TblCampania campania = tblPreimplementacion.getTblCampania( ) ;
                        // lanza las alarmas de la tarea
			saveScreenWorkAlarmsFlujo( firstWork , user , 1 , cuenta , asset , et , campania ) ;
			
			et.commit( ) ;
			
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AddingError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_THROW_EXIT , 
					e ) ;
		}
		
		return true ;
	}

	public static int stepUpWorkFlow( UserLogin usuario , int cveTareaPreimplementacion , String nombreSalida , int cveUsuario )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// en caso de nombre nulo
		if( cveTareaPreimplementacion < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.CvePreimplementationWrong" , cveTareaPreimplementacion ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_WRONG , 
					null ) ;
		
		// ping( 249 ) ;
		
		// busca la forma
		TblTareaPreimplementacion tblTareaPreimplementacion = em.find( TblTareaPreimplementacion.class , new Integer( cveTareaPreimplementacion ) ) ;
		
		// en caso de tareaPreimplementacion nulo
		if( tblTareaPreimplementacion == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.CvePreimplementationNotExist" , cveTareaPreimplementacion ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_NOT_EXIST , 
					null ) ;
		
		// en caso de nombre nulo
		if( cveUsuario < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.CveUserWrong" , cveUsuario ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_USER_WRONG , 
					null ) ;
		
		// busca el usuario
		TblUsuario tblUsuario = em.find( TblUsuario.class , new Integer( cveUsuario ) ) ;
		
		// en caso usuario nulo
		if( tblUsuario == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.CveUserNotExist" , cveUsuario ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_USER_NOT_EXIST , 
					null ) ;
		
		// toma la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		// toma los TblTareaFlujo
		List< TblTareaFlujo > tblTareaFlujos = findAllTblTareaFlujoWithWorkInAndExit( tarea.getCveTarea( ) , nombreSalida ) ;
		
		// en caso de ser null, habra error
		if( tblTareaFlujos == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.ExitNotConfigured" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_USER_NOT_EXIST , 
					null ) ;
		
		// toma la salida con el nombre dado de la tarea
		List< TblFormaSalida > salidas = getAllActiveExitNameInForm( tarea.getTblForma( ).getCveForma( ) , nombreSalida ) ;
		
		// en caso de que no haya
		if( salidas == null || salidas.size( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.NameExitOnFormNotExist" , nombreSalida , tarea.getTblForma( ).getNombre( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_EXIT_NOT_EXIST_IN_FORM , 
					null ) ;
		
		// en caso de que si exista
		TblFormaSalida salida = null ;
		
		for( TblFormaSalida s : salidas )
			if( s.getStatus( ) == 1 )
			{
				salida = s ;
				
				break ;
			}
		
		// en caso de que si haya tareaFlujos los procesa
		
		TblCuenta cuenta = em.find( TblCuenta.class , new Integer( usuario.getActualCountId( ) ) ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// toma el flujo tblPreimplementacion
			TblPreimplementacion tblPreimplementacion = tblTareaPreimplementacion.getTblPreimplementacion( ) ;
                        TblCampania campania = tblPreimplementacion.getTblCampania() ;
			
			// toma el flujo
			TblFlujo flujo = tblPreimplementacion.getTblFlujo( ) ;
			
			// toma el tipo de flujo
			int tipoFlujo = flujo.getTipo( ) ;
			
			Timestamp ejecucion = new Timestamp( System.currentTimeMillis( ) ) ;
			
			// modifica la fecha de ejecucion y el usuario
			tblTareaPreimplementacion.setFechaEjecucion( ejecucion ) ;
			tblTareaPreimplementacion.setEjecutado( ( byte ) 1 ) ;
			tblTareaPreimplementacion.setTblUsuario( tblUsuario ) ;
			
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
			
			// se ejecuta una tarea, por tanto se almacenan las alertas relacionadas con la salida que se ejecuto
			// y se mandan los correos correspondientes.
			//--------------------
			saveScreenWorkExitAlerts( tarea , salida , usuario , tipoFlujo , cuenta , null , et , campania ) ;
			sendMailWorkExitAlerts( tarea , salida , usuario , tipoFlujo , cuenta , null , et , campania ) ;
			
			// en caso de que no haya mas tblTareaFlujos
			if( tblTareaFlujos == null || tblTareaFlujos.size( ) == 0 )
			{
				// cambia la bandera al TblPreimplementacion a finalizado
				tblPreimplementacion.setBandera( ( byte ) 2 ) ;
				
				em.merge( tblPreimplementacion ) ;
				em.flush( ) ;
//				em.refresh( tblPreimplementacion ) ;
				
				et.commit( ) ;
				
				// regresa indicando que ya es la ultima tarea del ciclo
				return FlowUtil.FLOW_SETUP_WORK_RESULT_LAST_WORK_IN_FLOW ;
			}
			
			// recorre cada tblTareaFlujos
			for( TblTareaFlujo tblTareaFlujo : tblTareaFlujos )
			{
				// toma la tarea siguiente
				TblTarea siguienteTarea = tblTareaFlujo.getTblTarea2( ) ;
				
				// en caso d eque el tipo sea 1 (Preimplementacion)
				if( tipoFlujo == 1 )
				{
					// se guarda un solo registro, auqnue haya mil asset
					TblAsset asset = null ;
					
					// toma los assets del flujo de preimplementacion
					List< TblAsset > assets = tblPreimplementacion.getTblAssets( ) ;
					
					// recorre los assets
					for( TblAsset assetA : assets )
						// en caso de que este activo
						if( assetA.getStatus( ) == 1 )
						{
							asset = assetA ;
							
							break ;
						}
					
					// forma el TblTareaPreimplementacion
					TblTareaPreimplementacion tblTareaPreimplementacionNuevo = new TblTareaPreimplementacion( ) ;
					
					// calcula la fecha de activacion de la tarea
					Timestamp fecha = siguienteTarea.getFechaActiva( ) ;
					int dias = siguienteTarea.getFecActDias( ) ;
					int idFecha = siguienteTarea.getFecActFecha( ) ;
					Timestamp fechaFinal = null ;
					
					System.out.println( "Tarea: " + siguienteTarea.getCveTarea( ) ) ;
					System.out.println( "Tarea: " + siguienteTarea.getNombre( ) ) ;
					System.out.println( "Tarea: " + siguienteTarea.getFirstWork( ) ) ;
					System.out.println( "Fecha Activa: " + fecha ) ;
					System.out.println( "dias: " + dias ) ;
					System.out.println( "Id Fecha: " + idFecha ) ;
					
					// en caso de que fecha este en no null
					if( fecha != null )
						fechaFinal = fecha ;
					// en caos de que sea null
					else
					{
						// toma la fecha de la tarea
						java.util.Date fechaRel = null ;
						
						switch( idFecha )
						{
							case 1 :
								fechaRel = asset.getFecha( ) ;
								break ;
							case 2 :
								fechaRel = asset.getFecEntregaBc( ) ;
								break ;
							case 3 :
								fechaRel = asset.getFecAprobBc( ) ;
								break ;
							case 4 :
								fechaRel = asset.getFecLimiteSolCot( ) ;
								break ;
							case 5 :
								fechaRel = asset.getFecLimReqCompra( ) ;
								break ;
							case 6 :
								fechaRel = asset.getFecLimSubeCont( ) ;
								break ;
							case 7 :
								fechaRel = asset.getFecLimPrimFact( ) ;
								break ;
							case 8 :
								fechaRel = asset.getFecConfSede( ) ;
								break ;
							case 9 :
								fechaRel = asset.getFecFinCamp( ) ;
								break ;
							case 10 :
								fechaRel = asset.getFecLimSegFact( ) ;
								break ;
							case 11 :
								fechaRel = asset.getFecLimAgenda( ) ;
								break ;
							case 12 :
								fechaRel = asset.getFecLimGanadores( ) ;
								break ;
							case 13 :
								fechaRel = asset.getFecLimBoletos( ) ;
								break ;
							case 14 :
								fechaRel = asset.getFecSalida( ) ;
								break ;
							case 15 :
								fechaRel = asset.getFecRegreso( ) ;
								break ;
							case 16 :
								fechaRel = asset.getFecEva( ) ;
								break ;
						}
						
						if( fechaRel != null )
						{
//							GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//							gc.add( Calendar.DATE , dias ) ;
                                                    Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//							fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
						}

					}
					
					System.out.println( "Fecha Final: " + fechaFinal ) ;
					
					tblTareaPreimplementacionNuevo.setEjecutado( ( byte ) 2 ) ;
//						System.out.println( "Fecha de activacion: " + fechaFinal ) ;
					tblTareaPreimplementacionNuevo.setFechaActiva( fechaFinal ) ;
					
					fecha = siguienteTarea.getFechaLimite( ) ;
					dias = siguienteTarea.getFecLimDias( ) ;
					idFecha = siguienteTarea.getFecLimFechas( ) ;
					fechaFinal = null ;
					
					System.out.println( "Fecha Limite: " + fecha ) ;
					System.out.println( "dias: " + dias ) ;
					System.out.println( "Id Fecha: " + idFecha ) ;
					
					// en caso de que fecha este en no null
					if( fecha != null )
						fechaFinal = fecha ;
					// en caos de que sea null
					else
					{
						// toma la fecha de la tarea
						java.util.Date fechaRel = null ;
						
//							System.out.println( "Id Fecha: " + idFecha ) ;
						switch( idFecha )
						{
							case 1 :
								fechaRel = asset.getFecha( ) ;
								break ;
							case 2 :
								fechaRel = asset.getFecEntregaBc( ) ;
								break ;
							case 3 :
								fechaRel = asset.getFecAprobBc( ) ;
								break ;
							case 4 :
								fechaRel = asset.getFecLimiteSolCot( ) ;
								break ;
							case 5 :
								fechaRel = asset.getFecLimReqCompra( ) ;
								break ;
							case 6 :
								fechaRel = asset.getFecLimSubeCont( ) ;
								break ;
							case 7 :
								fechaRel = asset.getFecLimPrimFact( ) ;
								break ;
							case 8 :
								fechaRel = asset.getFecConfSede( ) ;
								break ;
							case 9 :
								fechaRel = asset.getFecFinCamp( ) ;
								break ;
							case 10 :
								fechaRel = asset.getFecLimSegFact( ) ;
								break ;
							case 11 :
								fechaRel = asset.getFecLimAgenda( ) ;
								break ;
							case 12 :
								fechaRel = asset.getFecLimGanadores( ) ;
								break ;
							case 13 :
								fechaRel = asset.getFecLimBoletos( ) ;
								break ;
							case 14 :
								fechaRel = asset.getFecSalida( ) ;
								break ;
							case 15 :
								fechaRel = asset.getFecRegreso( ) ;
								break ;
							case 16 :
								fechaRel = asset.getFecEva( ) ;
								break ;
						}
						
						if( fechaRel != null )
						{
//							GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//							System.out.println( "Fecha Rel: " + gc ) ;
//							gc.add( Calendar.DATE , dias ) ;
//							System.out.println( "Fecha Final: " + gc ) ;
                                                    Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//							fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
						}

					}
					
//						System.out.println( "Fecha limite: " + fechaFinal ) ;
					tblTareaPreimplementacionNuevo.setFechaLimite( fechaFinal ) ;
					tblTareaPreimplementacionNuevo.setFechaEjecucion( null ) ;
//						tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
					tblTareaPreimplementacionNuevo.setTblUsuario( null ) ;
//						TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
//						System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
//						pk.setCveTarea( firstWork.getCveTarea( ) ) ;
//						pk.setCveAsset( asset.getCveAsset( ) ) ;
//						pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
//						tblTareaPreimplementacion.setId( pk ) ;
					tblTareaPreimplementacionNuevo.setTblAsset( asset ) ;
					tblTareaPreimplementacionNuevo.setTblTarea( siguienteTarea ) ;
					tblTareaPreimplementacionNuevo.setTblPreimplementacion( tblPreimplementacion ) ;
//						tblTareaPreimplementacion.setTblAsset( asset ) ;
//						tblTareaPreimplementacion.setTblTarea( firstWork ) ;
					
//						System.out.println( "*******: " + firstWork ) ;
//						System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;
					
					// agrega a la base de datos
					em.merge( tblTareaPreimplementacionNuevo ) ;
					em.flush( ) ;
//					em.refresh( tblTareaPreimplementacionNuevo ) ;
					
//						System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;
					
					siguienteTarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
					em.merge( siguienteTarea ) ;
					em.flush( ) ;
//					em.refresh( siguienteTarea ) ;
					
					tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
					em.merge( tblPreimplementacion ) ;
					em.flush( ) ;
//					em.refresh( tblPreimplementacion ) ;
					
					// se registra una tarea nueva, por tanto se almacenan las alarmas relacionadas con dicha tarea
					//--------------------
					saveScreenWorkAlarms( siguienteTarea , usuario, tipoFlujo , cuenta , asset , et , campania ) ;
				}
				// en caso de que sea flujos de campana, o implementacion
				else
				{
					// toma los assets del flujo de preimplementacion
					List< TblAsset > assets = tblPreimplementacion.getTblAssets( ) ;
					// guarda los activos
					List< TblAsset > assetsActivos = new ArrayList< TblAsset >( ) ;
					
					// recorre los assets
					for( TblAsset asset : assets )
						// en caso de que este activo
						if( asset.getStatus( ) == 1 )
							// agrega
							assetsActivos.add( asset ) ;
					
					// por cada asset activo agrega un nuevo TblTareaPreimplementacion
					for( TblAsset asset : assetsActivos )
					{
						// forma el TblTareaPreimplementacion
						TblTareaPreimplementacion tblTareaPreimplementacionNuevo = new TblTareaPreimplementacion( ) ;
						
						// calcula la fecha de activacion de la tarea
						Timestamp fecha = siguienteTarea.getFechaActiva( ) ;
						int dias = siguienteTarea.getFecActDias( ) ;
						int idFecha = siguienteTarea.getFecActFecha( ) ;
						Timestamp fechaFinal = null ;
						
						// en caso de que fecha este en no null
						if( fecha != null )
							fechaFinal = fecha ;
						// en caos de que sea null
						else
						{
							// toma la fecha de la tarea
							java.util.Date fechaRel = null ;
							
							switch( idFecha )
							{
								case 1 :
									fechaRel = asset.getFecha( ) ;
									break ;
								case 2 :
									fechaRel = asset.getFecEntregaBc( ) ;
									break ;
								case 3 :
									fechaRel = asset.getFecAprobBc( ) ;
									break ;
								case 4 :
									fechaRel = asset.getFecLimiteSolCot( ) ;
									break ;
								case 5 :
									fechaRel = asset.getFecLimReqCompra( ) ;
									break ;
								case 6 :
									fechaRel = asset.getFecLimSubeCont( ) ;
									break ;
								case 7 :
									fechaRel = asset.getFecLimPrimFact( ) ;
									break ;
								case 8 :
									fechaRel = asset.getFecConfSede( ) ;
									break ;
								case 9 :
									fechaRel = asset.getFecFinCamp( ) ;
									break ;
								case 10 :
									fechaRel = asset.getFecLimSegFact( ) ;
									break ;
								case 11 :
									fechaRel = asset.getFecLimAgenda( ) ;
									break ;
								case 12 :
									fechaRel = asset.getFecLimGanadores( ) ;
									break ;
								case 13 :
									fechaRel = asset.getFecLimBoletos( ) ;
									break ;
								case 14 :
									fechaRel = asset.getFecSalida( ) ;
									break ;
								case 15 :
									fechaRel = asset.getFecRegreso( ) ;
									break ;
								case 16 :
									fechaRel = asset.getFecEva( ) ;
									break ;
							}
							
							if( fechaRel != null )
							{
//								GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//								gc.add( Calendar.DATE , dias ) ;
                                                            Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//								fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
							}

						}
						
						tblTareaPreimplementacionNuevo.setEjecutado( ( byte ) 2 ) ;
//							System.out.println( "Fecha de activacion: " + fechaFinal ) ;
						tblTareaPreimplementacionNuevo.setFechaActiva( fechaFinal ) ;
						
						fecha = siguienteTarea.getFechaLimite( ) ;
						dias = siguienteTarea.getFecLimDias( ) ;
						idFecha = siguienteTarea.getFecLimFechas( ) ;
						fechaFinal = null ;
						
						// en caso de que fecha este en no null
						if( fecha != null )
							fechaFinal = fecha ;
						// en caos de que sea null
						else
						{
							// toma la fecha de la tarea
							java.util.Date fechaRel = null ;
							
//								System.out.println( "Id Fecha: " + idFecha ) ;
							switch( idFecha )
							{
								case 1 :
									fechaRel = asset.getFecha( ) ;
									break ;
								case 2 :
									fechaRel = asset.getFecEntregaBc( ) ;
									break ;
								case 3 :
									fechaRel = asset.getFecAprobBc( ) ;
									break ;
								case 4 :
									fechaRel = asset.getFecLimiteSolCot( ) ;
									break ;
								case 5 :
									fechaRel = asset.getFecLimReqCompra( ) ;
									break ;
								case 6 :
									fechaRel = asset.getFecLimSubeCont( ) ;
									break ;
								case 7 :
									fechaRel = asset.getFecLimPrimFact( ) ;
									break ;
								case 8 :
									fechaRel = asset.getFecConfSede( ) ;
									break ;
								case 9 :
									fechaRel = asset.getFecFinCamp( ) ;
									break ;
								case 10 :
									fechaRel = asset.getFecLimSegFact( ) ;
									break ;
								case 11 :
									fechaRel = asset.getFecLimAgenda( ) ;
									break ;
								case 12 :
									fechaRel = asset.getFecLimGanadores( ) ;
									break ;
								case 13 :
									fechaRel = asset.getFecLimBoletos( ) ;
									break ;
								case 14 :
									fechaRel = asset.getFecSalida( ) ;
									break ;
								case 15 :
									fechaRel = asset.getFecRegreso( ) ;
									break ;
								case 16 :
									fechaRel = asset.getFecEva( ) ;
									break ;
							}
							
							if( fechaRel != null )
							{
//								GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//								gc.add( Calendar.DATE , dias ) ;
                                                            Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//								fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
							}

						}
						
//							System.out.println( "Fecha limite: " + fechaFinal ) ;
						tblTareaPreimplementacionNuevo.setFechaLimite( fechaFinal ) ;
						tblTareaPreimplementacionNuevo.setFechaEjecucion( null ) ;
//							tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
						tblTareaPreimplementacionNuevo.setTblUsuario( null ) ;
//							TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
//							System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
//							pk.setCveTarea( firstWork.getCveTarea( ) ) ;
//							pk.setCveAsset( asset.getCveAsset( ) ) ;
//							pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
//							tblTareaPreimplementacion.setId( pk ) ;
						tblTareaPreimplementacionNuevo.setTblAsset( asset ) ;
						tblTareaPreimplementacionNuevo.setTblTarea( siguienteTarea ) ;
						tblTareaPreimplementacionNuevo.setTblPreimplementacion( tblPreimplementacion ) ;
//							tblTareaPreimplementacion.setTblAsset( asset ) ;
//							tblTareaPreimplementacion.setTblTarea( firstWork ) ;
						
//							System.out.println( "*******: " + firstWork ) ;
//							System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;
						
						// agrega a la base de datos
						em.persist( tblTareaPreimplementacionNuevo ) ;
						em.flush( ) ;
						em.refresh( tblTareaPreimplementacionNuevo ) ;
						
//							System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;
						
						siguienteTarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
						em.merge( siguienteTarea ) ;
						em.flush( ) ;
//						em.refresh( siguienteTarea ) ;
						
						tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
						em.merge( tblPreimplementacion ) ;
						em.flush( ) ;
//						em.refresh( tblPreimplementacion ) ;
						
						// se registra una tarea nueva, por tanto se almacenan las alarmas relacionadas con dicha tarea
						//--------------------
						saveScreenWorkAlarms( siguienteTarea , usuario , tipoFlujo , cuenta , asset , et , campania ) ;
					}// termina for que recorre los assets
				}// termina el else para el caso de que sea flujo de campania o de implementacion
			}// fin del for que recorre los TblTareaFlujo surgidos de la salida ejecutada
			
			
			
			et.commit( ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AddingError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_THROW_EXIT , 
					e ) ;
		}
		
		return FlowUtil.FLOW_SETUP_WORK_RESULT_SAVE_NEXT_WORK ;
	}

	public static int stepUpWorkFlow( UserLogin usuario , int cveTareaPreimplementacion , String texto , String nombreSalida , int cveUsuario , EntityTransaction et )
		throws
			MasterCardException
	{
            
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
		// en caso de nombre nulo
		if( cveTareaPreimplementacion < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.CvePreimplementationWrong" , cveTareaPreimplementacion ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_WRONG , 
					null ) ;
		
		// ping( 250 ) ;
		
		// busca la forma
		TblTareaPreimplementacion tblTareaPreimplementacion = em.find( TblTareaPreimplementacion.class , new Integer( cveTareaPreimplementacion ) ) ;
                TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion().getTblCampania() ;
		
		// en caso de tareaPreimplementacion nulo
		if( tblTareaPreimplementacion == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.CvePreimplementationNotExist" , cveTareaPreimplementacion ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_NOT_EXIST , 
					null ) ;
		
		// en caso de nombre nulo
		if( cveUsuario < 1 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.CveUserWrong" , cveUsuario ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_USER_WRONG , 
					null ) ;
		
		// busca el usuario
		TblUsuario tblUsuario = em.find( TblUsuario.class , new Integer( cveUsuario ) ) ;
		
		// en caso usuario nulo
		if( tblUsuario == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.CveUserNotExist" , cveUsuario ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_USER_NOT_EXIST , 
					null ) ;
		
		int clvTarea = tblTareaPreimplementacion.getTblTarea( ).getMicroFlujo( ) ;
                TblTarea tarea = new TblTarea( ) ;
                
                if( clvTarea == 2 ) {
                    tarea = em.find( TblTarea.class , new Integer( 32 ) ) ;
                }else {
                    tarea = tblTareaPreimplementacion.getTblTarea( ) ;
                }
//                // toma la tarea
//		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
//		
		// toma los TblTareaFlujo
		List< TblTareaFlujo > tblTareaFlujos = findAllTblTareaFlujoWithWorkInAndExit( tarea.getCveTarea( ) , nombreSalida ) ;
                
		
		// en caso de ser null, habra error
		if( tblTareaFlujos == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.ExitNotConfigured" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CVE_USER_NOT_EXIST , 
					null ) ;
		
		// toma la salida con el nombre dado de la tarea
		List< TblFormaSalida > salidas = getAllActiveExitNameInForm( tarea.getTblForma( ).getCveForma( ) , nombreSalida ) ;
		
		// en caso de que no haya
		if( salidas == null || salidas.size( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.process.NameExitOnFormNotExist" , nombreSalida , tarea.getTblForma( ).getNombre( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_EXIT_NOT_EXIST_IN_FORM , 
					null ) ;
		
		// en caso de que si exista
		TblFormaSalida salida = null ;
		
		for( TblFormaSalida s : salidas )
			if( s.getStatus( ) == 1 )
			{
				salida = s ;
				
				break ;
			}
		
                TblCuenta cuenta = null ;
		// en caso de que si haya tareaFlujos los procesa
		if( campania != null ) {
                    cuenta = campania.getTblCuenta( ) ;
                }
		
                        //em.find( TblCuenta.class , new Integer( usuario.getActualCountId( ) ) ) ;
		
		try
		{
			// toma el flujo tblPreimplementacion
			TblPreimplementacion tblPreimplementacion = tblTareaPreimplementacion.getTblPreimplementacion( ) ;
			
			// toma el flujo
			TblFlujo flujo = tblPreimplementacion.getTblFlujo( ) ;
			
			// toma el tipo de flujo
			int tipoFlujo = flujo.getTipo( ) ;
			
			Timestamp ejecucion = new Timestamp( System.currentTimeMillis( ) ) ;
			
			// modifica la fecha de ejecucion y el usuario
			tblTareaPreimplementacion.setFechaEjecucion( ejecucion ) ;
			tblTareaPreimplementacion.setEjecutado( ( byte ) 1 ) ;
			tblTareaPreimplementacion.setTblUsuario( tblUsuario ) ;
			
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
                        
                        // LISTA DE ROLES A EJECUTAR MICROFLUJO
                        List<TblPreimplementacionFlujoautRoles> listPreimFluAutRol = findAllFindAllFlowsAuthorizationRolsByPreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
                        
                        // SIGUIENTE ROL A EJECUTAR
                        TblPreimplementacionFlujoautRoles PreimFluAutRol = new TblPreimplementacionFlujoautRoles( ) ;
                        TblTarea tareaMF = null ;
                        
                        for( TblPreimplementacionFlujoautRoles tpfr : listPreimFluAutRol ) {
                            
                            if (PreimFluAutRol.getCvePreimplementacionFlujoautRoles( ) < 1  ) {
                                PreimFluAutRol = tpfr ;
                            } else if ( PreimFluAutRol.getOrden( ) > tpfr.getOrden() ) {
                                PreimFluAutRol = tpfr ;
                            }
                            
                        }
                        
			// MICROFLUJO
                        if( !listPreimFluAutRol.isEmpty( ) && tarea.getCveTarea( ) == 32 ) {
//                            buscar las teras para los roles de micro flujo
                            List< TblTarea > tareasMF = TareasActivasDeMicroFlujo( ) ;
                            int rolMF = PreimFluAutRol.getTblRole( ).getCveRole( ) ;
                            
                            for( TblTarea tmf : tareasMF ) {
                                
                                if( tmf.getTblRole( ).getCveRole( ) == rolMF ) {
                                    tareaMF = tmf ;
                                    break ;
                                }                                    
                            }
                            
                            PreimFluAutRol.setEjecucion( "SI" ) ;
                            
                            TblTareaPreimplementacion tarPreimpl = new TblTareaPreimplementacion( ) ;
                            tarPreimpl.setTblPreimplementacion( tblPreimplementacion ) ;
                            tarPreimpl.setTblTarea( tareaMF ) ;
                            tarPreimpl.setTblAsset( tblTareaPreimplementacion.getTblAsset( ) ) ;
                            tarPreimpl.setEjecutado( ( byte ) 2 ) ;
                            tarPreimpl.setFechaActiva( tblTareaPreimplementacion.getFechaActiva( ) ) ;
                            tarPreimpl.setFechaLimite( tblTareaPreimplementacion.getFechaLimite( ) ) ;
                            em.persist( tarPreimpl ) ;
                            em.flush( ) ;
                            em.refresh( tarPreimpl ) ;
                            
                            NotificationUtil.throwNotificationTypeGenerateCampaign( campania , et , tareaMF.getTblRole( ).getCveRole( ) ) ;
                            
                            return FlowUtil.FLOW_SETUP_WORK_RESULT_SAVE_NEXT_WORK ;
			
                        }
			
                        // en caso de que no haya mas tblTareaFlujos
			if( tblTareaFlujos == null || tblTareaFlujos.size( ) == 0 ){
                            // envia las alertas correspondients a la salida de la tarea recien ejecutada
                            saveScreenWorkExitAlerts( tarea , salida , usuario , tipoFlujo , cuenta , null , et , campania ) ;
                            sendMailWorkExitAlerts( tarea , salida , usuario , tipoFlujo , cuenta , null , et , campania ) ;
                        }else{
                            // ciclo para validar si envia las alertas de salida para tarea, solo para carga de resultados
                            for( TblTareaFlujo tblTareaFlujo : tblTareaFlujos )
                            {
                                // toma la tarea siguiente
					TblTarea siguienteTarea = tblTareaFlujo.getTblTarea2( ) ;
                                        boolean tareasPreviasEjecutadas = true ;
                                        // si la suiguiente tarea es carga de resultados.
                                        if ( siguienteTarea.getCveTarea( ) == 71 )
                                        {
                                            tareasPreviasEjecutadas = MismaTarea.revisarEjecutadas( tblTareaPreimplementacion ) ;
                                        }else {
                                            tareasPreviasEjecutadas = true ;
                                        }
                                        
                                        if ( tareasPreviasEjecutadas == true )
                                        {
                                            // envia las alertas correspondients a la salida de la tarea recien ejecutada
                                            saveScreenWorkExitAlerts( tarea , salida , usuario , tipoFlujo , cuenta , null , et , campania ) ;
                                            sendMailWorkExitAlerts( tarea , salida , usuario , tipoFlujo , cuenta , null , et , campania ) ;
                                        }
                            }
                        }
			
			System.out.println( "*** MasterCarDAO.java: tblTareaFlujos/" + salida ) ;
			System.out.println( "*** MasterCarDAO.java: tblTareaFlujos/" + tblTareaFlujos.size( ) ) ;
			
			// en caso de que no haya mas tblTareaFlujos
			if( tblTareaFlujos == null || tblTareaFlujos.size( ) == 0 )
			{                            
				// cambia la bandera al TblPreimplementacion a finalizado
				tblPreimplementacion.setBandera( ( byte ) 2 ) ;
				
				em.merge( tblPreimplementacion ) ;
				em.flush( ) ;
//				em.refresh( tblPreimplementacion ) ;
				
				// en caso de que sea tipo preimplementacion
				if( flujo.getTipo( ) == 1 )
				{
					// dado que ya es la ultima tarea, y el flujo es de tipo preimplementacion
					// debe lanzar para cada asset el flujo de implementacion
					// toma la lista de asset relacionada con el flujo
					List< TblAsset > assets = tblPreimplementacion.getTblAssets( ) ;
					
					// recorre los assets
					for( TblAsset asset : assets )
					{
						// en caso de desactivado
						if( asset.getStatus( ) == 0 )
							// siguient
							continue ;
						
						// lanza flujo de implementacion
						MasterCardDAO.throwImplementation( usuario , null , asset , et ) ;
					}
				}
			}
			// en caso de que si haya tareas dentro del flujo
			else
			{
					// regresa indicando que ya es la ultima tarea del ciclo
	//				return FlowUtil.FLOW_SETUP_WORK_RESULT_LAST_WORK_IN_FLOW ;
				
				// recorre cada tblTareaFlujos
				for( TblTareaFlujo tblTareaFlujo : tblTareaFlujos )
				{
					// toma la tarea siguiente
					TblTarea siguienteTarea = tblTareaFlujo.getTblTarea2( ) ;
                                        boolean tareasPreviasEjecutadas = true ;
                                        
                                        if ( siguienteTarea.getCveTarea( ) == 71 )
                                        {
                                            tareasPreviasEjecutadas = MismaTarea.revisarEjecutadas( tblTareaPreimplementacion ) ;
                                        }
                                        
                                        if ( tareasPreviasEjecutadas == true )
                                        {   
                                        
					// en caso d eque el tipo sea 1 (Preimplementacion)
					if( tipoFlujo == 1 || siguienteTarea.getMultiple( ) == 1 )
					{
						// se guarda un solo registro, auqnue haya mil asset
						TblAsset asset = null ;
						
						// toma los assets del flujo de preimplementacion
						List< TblAsset > assets = tblPreimplementacion.getTblAssets( ) ;
						
						// recorre los assets
						for( TblAsset assetA : assets )
							// en caso de que este activo
							if( assetA.getStatus( ) == 1 )
							{
								asset = assetA ;
								
								break ;
							}
						
						// forma el TblTareaPreimplementacion
						TblTareaPreimplementacion tblTareaPreimplementacionNuevo = new TblTareaPreimplementacion( ) ;
						
						// calcula la fecha de activacion de la tarea
						Timestamp fecha = siguienteTarea.getFechaActiva( ) ;
						int dias = siguienteTarea.getFecActDias( ) ;
						int idFecha = siguienteTarea.getFecActFecha( ) ;
						Timestamp fechaFinal = null ;
						
						System.out.println( "Tarea: " + siguienteTarea.getCveTarea( ) ) ;
						System.out.println( "Tarea: " + siguienteTarea.getNombre( ) ) ;
						System.out.println( "Tarea: " + siguienteTarea.getFirstWork( ) ) ;
						System.out.println( "Fecha Activa: " + fecha ) ;
						System.out.println( "dias: " + dias ) ;
						System.out.println( "Id Fecha: " + idFecha ) ;
						
						// en caso de que fecha este en no null
						if( fecha != null )
							fechaFinal = fecha ;
						// en caos de que sea null
						else
						{
							// toma la fecha de la tarea
							java.util.Date fechaRel = null ;
							
							System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha a tomar/" + idFecha ) ;
							
							switch( idFecha )
							{
								case 1 :
									fechaRel = asset.getFecha( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 1/" + fechaRel ) ;
									break ;
								case 2 :
									fechaRel = asset.getFecEntregaBc( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 2/" + fechaRel ) ;
									break ;
								case 3 :
									fechaRel = asset.getFecAprobBc( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 3/" + fechaRel ) ;
									break ;
								case 4 :
									fechaRel = asset.getFecLimiteSolCot( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 4/" + fechaRel ) ;
									break ;
								case 5 :
									fechaRel = asset.getFecLimReqCompra( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 5/" + fechaRel ) ;
									break ;
								case 6 :
									fechaRel = asset.getFecLimSubeCont( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 6/" + fechaRel ) ;
									break ;
								case 7 :
									fechaRel = asset.getFecLimPrimFact( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 7/" + fechaRel ) ;
									break ;
								case 8 :
									fechaRel = asset.getFecConfSede( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 8/" + fechaRel ) ;
									break ;
								case 9 :
									fechaRel = asset.getFecFinCamp( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 9/" + fechaRel ) ;
									break ;
								case 10 :
									fechaRel = asset.getFecLimSegFact( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 10/" + fechaRel ) ;
									break ;
								case 11 :
									fechaRel = asset.getFecLimAgenda( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 11/" + fechaRel ) ;
									break ;
								case 12 :
									fechaRel = asset.getFecLimGanadores( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 12/" + fechaRel ) ;
									break ;
								case 13 :
									fechaRel = asset.getFecLimBoletos( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 13/" + fechaRel ) ;
									break ;
								case 14 :
									fechaRel = asset.getFecSalida( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 14/" + fechaRel ) ;
									break ;
								case 15 :
									fechaRel = asset.getFecRegreso( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 15/" + fechaRel ) ;
									break ;
								case 16 :
									fechaRel = asset.getFecEva( ) ;
									System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha tomada 16/" + fechaRel ) ;
									break ;
							}
							
							if( fechaRel != null )
							{
//								GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDate( ) ) ;
//								System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha parcial/" + gc ) ;
//								System.out.println( "MasterCardDAO.java: stepUpWorkFlow: dias a sumar/" + dias ) ;
//								gc.add( Calendar.DATE , dias ) ;
//								System.out.println( "MasterCardDAO.java: stepUpWorkFlow: Fecha con suma/" + gc ) ;
                                                            Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//								fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
							}
	
						}
						
						System.out.println( "Fecha Final: " + fechaFinal ) ;
						
						tblTareaPreimplementacionNuevo.setEjecutado( ( byte ) 2 ) ;
	//						System.out.println( "Fecha de activacion: " + fechaFinal ) ;
						tblTareaPreimplementacionNuevo.setFechaActiva( fechaFinal ) ;
						
						fecha = siguienteTarea.getFechaLimite( ) ;
						dias = siguienteTarea.getFecLimDias( ) ;
						idFecha = siguienteTarea.getFecLimFechas( ) ;
						fechaFinal = null ;
						
						System.out.println( "Fecha Limite: " + fecha ) ;
						System.out.println( "dias: " + dias ) ;
						System.out.println( "Id Fecha: " + idFecha ) ;
						
						// en caso de que fecha este en no null
						if( fecha != null )
							fechaFinal = fecha ;
						// en caos de que sea null
						else
						{
							// toma la fecha de la tarea
							java.util.Date fechaRel = null ;
							
	//							System.out.println( "Id Fecha: " + idFecha ) ;
							switch( idFecha )
							{
								case 1 :
									fechaRel = asset.getFecha( ) ;
									break ;
								case 2 :
									fechaRel = asset.getFecEntregaBc( ) ;
									break ;
								case 3 :
									fechaRel = asset.getFecAprobBc( ) ;
									break ;
								case 4 :
									fechaRel = asset.getFecLimiteSolCot( ) ;
									break ;
								case 5 :
									fechaRel = asset.getFecLimReqCompra( ) ;
									break ;
								case 6 :
									fechaRel = asset.getFecLimSubeCont( ) ;
									break ;
								case 7 :
									fechaRel = asset.getFecLimPrimFact( ) ;
									break ;
								case 8 :
									fechaRel = asset.getFecConfSede( ) ;
									break ;
								case 9 :
									fechaRel = asset.getFecFinCamp( ) ;
									break ;
								case 10 :
									fechaRel = asset.getFecLimSegFact( ) ;
									break ;
								case 11 :
									fechaRel = asset.getFecLimAgenda( ) ;
									break ;
								case 12 :
									fechaRel = asset.getFecLimGanadores( ) ;
									break ;
								case 13 :
									fechaRel = asset.getFecLimBoletos( ) ;
									break ;
								case 14 :
									fechaRel = asset.getFecSalida( ) ;
									break ;
								case 15 :
									fechaRel = asset.getFecRegreso( ) ;
									break ;
								case 16 :
									fechaRel = asset.getFecEva( ) ;
									break ;
							}
							
							if( fechaRel != null )
							{
//								GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
//								System.out.println( "Fecha Rel: " + gc ) ;
//								gc.add( Calendar.DATE , dias ) ;
//								System.out.println( "Fecha Final: " + gc ) ;
                                                            Calendar calendari = Calendar.getInstance();
                                        calendari.setTime(fechaRel);
                                        calendari.add(Calendar.DATE , dias);
                                        fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
//								fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
							}
	
						}
						
	//						System.out.println( "Fecha limite: " + fechaFinal ) ;
						tblTareaPreimplementacionNuevo.setFechaLimite( fechaFinal ) ;
						tblTareaPreimplementacionNuevo.setFechaEjecucion( null ) ;
	//						tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
						tblTareaPreimplementacionNuevo.setTblUsuario( null ) ;
	//						TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
	//						System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
	//						pk.setCveTarea( firstWork.getCveTarea( ) ) ;
	//						pk.setCveAsset( asset.getCveAsset( ) ) ;
	//						pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
	//						tblTareaPreimplementacion.setId( pk ) ;
						tblTareaPreimplementacionNuevo.setTblAsset( asset ) ;
						tblTareaPreimplementacionNuevo.setTblTarea( siguienteTarea ) ;
						tblTareaPreimplementacionNuevo.setTblPreimplementacion( tblPreimplementacion ) ;
                                                tblTareaPreimplementacionNuevo.setTexto( texto ) ;
	//						tblTareaPreimplementacion.setTblAsset( asset ) ;
	//						tblTareaPreimplementacion.setTblTarea( firstWork ) ;
						
	//						System.out.println( "*******: " + firstWork ) ;
	//						System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;
						
						// agrega a la base de datos
						em.persist( tblTareaPreimplementacionNuevo ) ;
						em.flush( ) ;
						em.refresh( tblTareaPreimplementacionNuevo ) ;
						
	//						System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;
						
						siguienteTarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
						em.merge( siguienteTarea ) ;
						em.flush( ) ;
//						em.refresh( siguienteTarea ) ;
						
						tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
						em.merge( tblPreimplementacion ) ;
						em.flush( ) ;
//						em.refresh( tblPreimplementacion ) ;
						
						// se registra una tarea nueva, por tanto se almacenan las alarmas relacionadas con dicha tarea
						//--------------------
						saveScreenWorkAlarms( siguienteTarea , usuario, tipoFlujo , cuenta , asset , et  , campania ) ;
					}
					// en caso de que sea flujos de campana, o implementacion
					else
					{
						// inicia cracion de nuevo registro TblTareaPreimplementacion
                                                // guarda los activos
						List< TblAsset > assetsActivos = new ArrayList< TblAsset >( ) ;                                                
                                            // si la tarea que activo la creacion de nuevo registro TblTareaPreimplementacion
                                            //tenia Multiple 1 se ejecuta una insercion de TblTareaPreimplementacion por cada TblPreimplementacion con la misma campaña
                                            // ya que una TblPreimplementacion solo tiene un asset
                                                if ( tblTareaFlujo.getTblTarea1( ).getMultiple( ) == 1 )
                                                {
                                                    List< TblPreimplementacion > tblPreimplementacions = new ArrayList< TblPreimplementacion >( ) ;
                                                    // LLENA LA LISTA DE TblPreimplementacion DEPENDIENDO EL TIPO DE FLUJO
                                                    if ( tblPreimplementacion.getTblFlujo( ).getTipo( ) == 2 ) {
                                                        // PARA FLUJO DE IMPLEMENTACION
                                                        tblPreimplementacions.add( tblPreimplementacion ) ;
                                                    } else {
                                                        int cveCampana = tblPreimplementacion.getTblCampania( ).getCveCampania( ) ;
                                                    // obtiene  todos los registros de tblPreimplementacion que tengan la misma campaña  que el actual
                                                    tblPreimplementacions = getAllPreimplementationsWithCampana( cveCampana ) ;
                                                    }
                                                    
                                                    
                                                    for ( TblPreimplementacion tblP : tblPreimplementacions )
                                                    {
                                                        
                                                        // toma los assets del flujo de preimplementacion
                                                        List< TblAsset > assets = tblP.getTblAssets( ) ;


                                                        // recorre los assets
                                                        for( TblAsset asset : assets )
                                                                // en caso de que este activo
                                                                if( asset.getStatus( ) == 1 )
                                                                        // agrega
                                                                        assetsActivos.add( asset ) ;
                                                        
                                                        //op insert 1
                                                        // por cada asset activo agrega un nuevo TblTareaPreimplementacion
                                                            for( TblAsset asset : assetsActivos )
                                                            {
                                                                    // forma el TblTareaPreimplementacion
                                                                    TblTareaPreimplementacion tblTareaPreimplementacionNuevo = new TblTareaPreimplementacion( ) ;

                                                                    // calcula la fecha de activacion de la tarea
                                                                    Timestamp fecha = siguienteTarea.getFechaActiva( ) ;
                                                                    int dias = siguienteTarea.getFecActDias( ) ;
                                                                    int idFecha = siguienteTarea.getFecActFecha( ) ;
                                                                    Timestamp fechaFinal = null ;

                                                                    // en caso de que fecha este en no null
                                                                    if( fecha != null )
                                                                            fechaFinal = fecha ;
                                                                    // en caos de que sea null
                                                                    else
                                                                    {
                                                                            // toma la fecha de la tarea
                                                                            java.util.Date fechaRel = null ;

                                                                            switch( idFecha )
                                                                            {
                                                                                    case 1 :
                                                                                            fechaRel = asset.getFecha( ) ;
                                                                                            break ;
                                                                                    case 2 :
                                                                                            fechaRel = asset.getFecEntregaBc( ) ;
                                                                                            break ;
                                                                                    case 3 :
                                                                                            fechaRel = asset.getFecAprobBc( ) ;
                                                                                            break ;
                                                                                    case 4 :
                                                                                            fechaRel = asset.getFecLimiteSolCot( ) ;
                                                                                            break ;
                                                                                    case 5 :
                                                                                            fechaRel = asset.getFecLimReqCompra( ) ;
                                                                                            break ;
                                                                                    case 6 :
                                                                                            fechaRel = asset.getFecLimSubeCont( ) ;
                                                                                            break ;
                                                                                    case 7 :
                                                                                            fechaRel = asset.getFecLimPrimFact( ) ;
                                                                                            break ;
                                                                                    case 8 :
                                                                                            fechaRel = asset.getFecConfSede( ) ;
                                                                                            break ;
                                                                                    case 9 :
                                                                                            fechaRel = asset.getFecFinCamp( ) ;
                                                                                            break ;
                                                                                    case 10 :
                                                                                            fechaRel = asset.getFecLimSegFact( ) ;
                                                                                            break ;
                                                                                    case 11 :
                                                                                            fechaRel = asset.getFecLimAgenda( ) ;
                                                                                            break ;
                                                                                    case 12 :
                                                                                            fechaRel = asset.getFecLimGanadores( ) ;
                                                                                            break ;
                                                                                    case 13 :
                                                                                            fechaRel = asset.getFecLimBoletos( ) ;
                                                                                            break ;
                                                                                    case 14 :
                                                                                            fechaRel = asset.getFecSalida( ) ;
                                                                                            break ;
                                                                                    case 15 :
                                                                                            fechaRel = asset.getFecRegreso( ) ;
                                                                                            break ;
                                                                                    case 16 :
                                                                                            fechaRel = asset.getFecEva( ) ;
                                                                                            break ;
                                                                            }

                                                                            if( fechaRel != null )
                                                                            {
                                                                                Calendar calendari = Calendar.getInstance();
                                                    calendari.setTime(fechaRel);
                                                    calendari.add(Calendar.DATE , dias);
                                                    fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
                                                                            }

                                                                    }

                                                                    tblTareaPreimplementacionNuevo.setEjecutado( ( byte ) 2 ) ;
                                                                    tblTareaPreimplementacionNuevo.setFechaActiva( fechaFinal ) ;

                                                                    fecha = siguienteTarea.getFechaLimite( ) ;
                                                                    dias = siguienteTarea.getFecLimDias( ) ;
                                                                    idFecha = siguienteTarea.getFecLimFechas( ) ;
                                                                    fechaFinal = null ;

                                                                    // en caso de que fecha este en no null
                                                                    if( fecha != null )
                                                                            fechaFinal = fecha ;
                                                                    // en caos de que sea null
                                                                    else
                                                                    {
                                                                            // toma la fecha de la tarea
                                                                            java.util.Date fechaRel = null ;

                                                                            switch( idFecha )
                                                                            {
                                                                                    case 1 :
                                                                                            fechaRel = asset.getFecha( ) ;
                                                                                            break ;
                                                                                    case 2 :
                                                                                            fechaRel = asset.getFecEntregaBc( ) ;
                                                                                            break ;
                                                                                    case 3 :
                                                                                            fechaRel = asset.getFecAprobBc( ) ;
                                                                                            break ;
                                                                                    case 4 :
                                                                                            fechaRel = asset.getFecLimiteSolCot( ) ;
                                                                                            break ;
                                                                                    case 5 :
                                                                                            fechaRel = asset.getFecLimReqCompra( ) ;
                                                                                            break ;
                                                                                    case 6 :
                                                                                            fechaRel = asset.getFecLimSubeCont( ) ;
                                                                                            break ;
                                                                                    case 7 :
                                                                                            fechaRel = asset.getFecLimPrimFact( ) ;
                                                                                            break ;
                                                                                    case 8 :
                                                                                            fechaRel = asset.getFecConfSede( ) ;
                                                                                            break ;
                                                                                    case 9 :
                                                                                            fechaRel = asset.getFecFinCamp( ) ;
                                                                                            break ;
                                                                                    case 10 :
                                                                                            fechaRel = asset.getFecLimSegFact( ) ;
                                                                                            break ;
                                                                                    case 11 :
                                                                                            fechaRel = asset.getFecLimAgenda( ) ;
                                                                                            break ;
                                                                                    case 12 :
                                                                                            fechaRel = asset.getFecLimGanadores( ) ;
                                                                                            break ;
                                                                                    case 13 :
                                                                                            fechaRel = asset.getFecLimBoletos( ) ;
                                                                                            break ;
                                                                                    case 14 :
                                                                                            fechaRel = asset.getFecSalida( ) ;
                                                                                            break ;
                                                                                    case 15 :
                                                                                            fechaRel = asset.getFecRegreso( ) ;
                                                                                            break ;
                                                                                    case 16 :
                                                                                            fechaRel = asset.getFecEva( ) ;
                                                                                            break ;
                                                                            }

                                                                            if( fechaRel != null )
                                                                            {
                                                                                Calendar calendari = Calendar.getInstance();
                                                    calendari.setTime(fechaRel);
                                                    calendari.add(Calendar.DATE , dias);
                                                    fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
                                                                            }

                                                                    }

                                                                    tblTareaPreimplementacionNuevo.setFechaLimite( fechaFinal ) ;
                                                                    tblTareaPreimplementacionNuevo.setFechaEjecucion( null ) ;
                                                                    tblTareaPreimplementacionNuevo.setTblUsuario( null ) ;
                                                                    tblTareaPreimplementacionNuevo.setTblAsset( asset ) ;
                                                                    tblTareaPreimplementacionNuevo.setTblTarea( siguienteTarea ) ;
                                                                    tblTareaPreimplementacionNuevo.setTblPreimplementacion( tblP ) ;
                                                                    tblTareaPreimplementacionNuevo.setTexto( texto ) ;
                                                                    // agrega a la base de datos
                                                                    em.persist( tblTareaPreimplementacionNuevo ) ;
                                                                    em.flush( ) ;
                                                                    em.refresh( tblTareaPreimplementacionNuevo ) ;

                                                                    siguienteTarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
                                                                    em.merge( siguienteTarea ) ;
                                                                    em.flush( ) ;
//                                                                    em.refresh( siguienteTarea ) ;

                                                                    tblP.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
                                                                    em.merge( tblP ) ;
                                                                    em.flush( ) ;
//                                                                    em.refresh( tblP ) ;

                                                                    saveScreenWorkAlarms( siguienteTarea , usuario , tipoFlujo , cuenta , asset , et , campania ) ;
                                                            }// termina for que recorre los assets
                                                        //op insert 1
                                                        //Limpia el arreglo para que solo ejecute un asset por preimplementacion
                                                            assetsActivos = new ArrayList< TblAsset >( ) ;
                                                    }
                                                     
                                                }// termina el if para el caso de que venga de una tarea con parametro Multiple en 1
                                                else
                                                {
                                            // si la tarea que activo la creacion de nuevo registro TblTareaPreimplementacion
                                            //tenia Multiple 2 se ejecuta una insercion de TblTareaPreimplementacion por la TblPreimplementacion actual
                                            // ya que una TblPreimplementacion solo tiene un asset 
                                                    //op 2
                                                    // toma los assets del flujo de preimplementacion
                                                    List< TblAsset > assets = tblPreimplementacion.getTblAssets( ) ;


                                                    // recorre los assets
                                                    for( TblAsset asset : assets )
                                                            // en caso de que este activo
                                                            if( asset.getStatus( ) == 1 )
                                                                    // agrega
                                                                    assetsActivos.add( asset ) ;





                                                    // por cada asset activo agrega un nuevo TblTareaPreimplementacion
                                                    for( TblAsset asset : assetsActivos )
                                                    {
                                                            // forma el TblTareaPreimplementacion
                                                            TblTareaPreimplementacion tblTareaPreimplementacionNuevo = new TblTareaPreimplementacion( ) ;

                                                            // calcula la fecha de activacion de la tarea
                                                            Timestamp fecha = siguienteTarea.getFechaActiva( ) ;
                                                            int dias = siguienteTarea.getFecActDias( ) ;
                                                            int idFecha = siguienteTarea.getFecActFecha( ) ;
                                                            Timestamp fechaFinal = null ;

                                                            // en caso de que fecha este en no null
                                                            if( fecha != null )
                                                                    fechaFinal = fecha ;
                                                            // en caos de que sea null
                                                            else
                                                            {
                                                                    // toma la fecha de la tarea
                                                                    java.util.Date fechaRel = null ;

                                                                    switch( idFecha )
                                                                    {
                                                                            case 1 :
                                                                                    fechaRel = asset.getFecha( ) ;
                                                                                    break ;
                                                                            case 2 :
                                                                                    fechaRel = asset.getFecEntregaBc( ) ;
                                                                                    break ;
                                                                            case 3 :
                                                                                    fechaRel = asset.getFecAprobBc( ) ;
                                                                                    break ;
                                                                            case 4 :
                                                                                    fechaRel = asset.getFecLimiteSolCot( ) ;
                                                                                    break ;
                                                                            case 5 :
                                                                                    fechaRel = asset.getFecLimReqCompra( ) ;
                                                                                    break ;
                                                                            case 6 :
                                                                                    fechaRel = asset.getFecLimSubeCont( ) ;
                                                                                    break ;
                                                                            case 7 :
                                                                                    fechaRel = asset.getFecLimPrimFact( ) ;
                                                                                    break ;
                                                                            case 8 :
                                                                                    fechaRel = asset.getFecConfSede( ) ;
                                                                                    break ;
                                                                            case 9 :
                                                                                    fechaRel = asset.getFecFinCamp( ) ;
                                                                                    break ;
                                                                            case 10 :
                                                                                    fechaRel = asset.getFecLimSegFact( ) ;
                                                                                    break ;
                                                                            case 11 :
                                                                                    fechaRel = asset.getFecLimAgenda( ) ;
                                                                                    break ;
                                                                            case 12 :
                                                                                    fechaRel = asset.getFecLimGanadores( ) ;
                                                                                    break ;
                                                                            case 13 :
                                                                                    fechaRel = asset.getFecLimBoletos( ) ;
                                                                                    break ;
                                                                            case 14 :
                                                                                    fechaRel = asset.getFecSalida( ) ;
                                                                                    break ;
                                                                            case 15 :
                                                                                    fechaRel = asset.getFecRegreso( ) ;
                                                                                    break ;
                                                                            case 16 :
                                                                                    fechaRel = asset.getFecEva( ) ;
                                                                                    break ;
                                                                    }

                                                                    if( fechaRel != null )
                                                                    {
    //									GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
    //									gc.add( Calendar.DATE , dias ) ;
                                                                        Calendar calendari = Calendar.getInstance();
                                            calendari.setTime(fechaRel);
                                            calendari.add(Calendar.DATE , dias);
                                            fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
    //									fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
                                                                    }

                                                            }

                                                            tblTareaPreimplementacionNuevo.setEjecutado( ( byte ) 2 ) ;
            //							System.out.println( "Fecha de activacion: " + fechaFinal ) ;
                                                            tblTareaPreimplementacionNuevo.setFechaActiva( fechaFinal ) ;

                                                            fecha = siguienteTarea.getFechaLimite( ) ;
                                                            dias = siguienteTarea.getFecLimDias( ) ;
                                                            idFecha = siguienteTarea.getFecLimFechas( ) ;
                                                            fechaFinal = null ;

                                                            // en caso de que fecha este en no null
                                                            if( fecha != null )
                                                                    fechaFinal = fecha ;
                                                            // en caos de que sea null
                                                            else
                                                            {
                                                                    // toma la fecha de la tarea
                                                                    java.util.Date fechaRel = null ;

            //								System.out.println( "Id Fecha: " + idFecha ) ;
                                                                    switch( idFecha )
                                                                    {
                                                                            case 1 :
                                                                                    fechaRel = asset.getFecha( ) ;
                                                                                    break ;
                                                                            case 2 :
                                                                                    fechaRel = asset.getFecEntregaBc( ) ;
                                                                                    break ;
                                                                            case 3 :
                                                                                    fechaRel = asset.getFecAprobBc( ) ;
                                                                                    break ;
                                                                            case 4 :
                                                                                    fechaRel = asset.getFecLimiteSolCot( ) ;
                                                                                    break ;
                                                                            case 5 :
                                                                                    fechaRel = asset.getFecLimReqCompra( ) ;
                                                                                    break ;
                                                                            case 6 :
                                                                                    fechaRel = asset.getFecLimSubeCont( ) ;
                                                                                    break ;
                                                                            case 7 :
                                                                                    fechaRel = asset.getFecLimPrimFact( ) ;
                                                                                    break ;
                                                                            case 8 :
                                                                                    fechaRel = asset.getFecConfSede( ) ;
                                                                                    break ;
                                                                            case 9 :
                                                                                    fechaRel = asset.getFecFinCamp( ) ;
                                                                                    break ;
                                                                            case 10 :
                                                                                    fechaRel = asset.getFecLimSegFact( ) ;
                                                                                    break ;
                                                                            case 11 :
                                                                                    fechaRel = asset.getFecLimAgenda( ) ;
                                                                                    break ;
                                                                            case 12 :
                                                                                    fechaRel = asset.getFecLimGanadores( ) ;
                                                                                    break ;
                                                                            case 13 :
                                                                                    fechaRel = asset.getFecLimBoletos( ) ;
                                                                                    break ;
                                                                            case 14 :
                                                                                    fechaRel = asset.getFecSalida( ) ;
                                                                                    break ;
                                                                            case 15 :
                                                                                    fechaRel = asset.getFecRegreso( ) ;
                                                                                    break ;
                                                                            case 16 :
                                                                                    fechaRel = asset.getFecEva( ) ;
                                                                                    break ;
                                                                    }

                                                                    if( fechaRel != null )
                                                                    {
    //									GregorianCalendar gc = new GregorianCalendar( fechaRel.getYear( ) + 1900 , fechaRel.getMonth( ) , fechaRel.getDay( ) ) ;
    //									gc.add( Calendar.DATE , dias ) ;
                                                                        Calendar calendari = Calendar.getInstance();
                                            calendari.setTime(fechaRel);
                                            calendari.add(Calendar.DATE , dias);
                                            fechaFinal = new Timestamp( calendari.getTimeInMillis() ) ;
    //									fechaFinal = new Timestamp( gc.getTimeInMillis( ) ) ;
                                                                    }

                                                            }

            //							System.out.println( "Fecha limite: " + fechaFinal ) ;
                                                            tblTareaPreimplementacionNuevo.setFechaLimite( fechaFinal ) ;
                                                            tblTareaPreimplementacionNuevo.setFechaEjecucion( null ) ;
            //							tblTareaPreimplementacion.setTblPreimplementacion( tblPreimplementacion ) ;
                                                            tblTareaPreimplementacionNuevo.setTblUsuario( null ) ;
            //							TblTareaPreimplementacionPK pk = new TblTareaPreimplementacionPK( ) ;
            //							System.out.println( firstWork.getCveTarea( ) + " - " + tblPreimplementacion.getCvePreimplementacion( ) ) ;
            //							pk.setCveTarea( firstWork.getCveTarea( ) ) ;
            //							pk.setCveAsset( asset.getCveAsset( ) ) ;
            //							pk.setCvePreimplementacion( tblPreimplementacion.getCvePreimplementacion( ) ) ;
            //							tblTareaPreimplementacion.setId( pk ) ;
                                                            tblTareaPreimplementacionNuevo.setTblAsset( asset ) ;
                                                            tblTareaPreimplementacionNuevo.setTblTarea( siguienteTarea ) ;
                                                            tblTareaPreimplementacionNuevo.setTblPreimplementacion( tblPreimplementacion ) ;
                                                            tblTareaPreimplementacionNuevo.setTexto( texto ) ;
            //							tblTareaPreimplementacion.setTblAsset( asset ) ;
            //							tblTareaPreimplementacion.setTblTarea( firstWork ) ;

            //							System.out.println( "*******: " + firstWork ) ;
            //							System.out.println( "*******: " + tblTareaPreimplementacion.getTblTarea( ) ) ;

                                                            // agrega a la base de datos
                                                            em.persist( tblTareaPreimplementacionNuevo ) ;
                                                            em.flush( ) ;
                                                            em.refresh( tblTareaPreimplementacionNuevo ) ;

            //							System.out.println( "&&&&&&&&7: " + tblTareaPreimplementacion.getId( ) ) ;

                                                            siguienteTarea.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
                                                            em.merge( siguienteTarea ) ;
                                                            em.flush( ) ;
//                                                            em.refresh( siguienteTarea ) ;

                                                            tblPreimplementacion.getTblTareaPreimplementacions( ).add( tblTareaPreimplementacionNuevo ) ;
                                                            em.merge( tblPreimplementacion ) ;
                                                            em.flush( ) ;
//                                                            em.refresh( tblPreimplementacion ) ;

                                                            // se registra una tarea nueva, por tanto se almacenan las alarmas relacionadas con dicha tarea
                                                            //--------------------
                                                            saveScreenWorkAlarms( siguienteTarea , usuario , tipoFlujo , cuenta , asset , et , campania ) ;
                                                    }// termina for que recorre los assets
                                                    //op 2                                                    
                                                }// termina else para tarea en caso de que venga con el parametro Multiple en 2 
                                                    
                                                
					}// termina el else para el caso de que sea flujo de campania o de implementacion
                                    } // fin del if que valida la ejecucion de las otras tareas para disparar la tarea 22
				}// fin del for que recorre los TblTareaFlujo surgidos de la salida ejecutada
			}
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.preimplementation.add.errors.AddingError" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_THROW_EXIT , 
					e ) ;
		}
		
		return FlowUtil.FLOW_SETUP_WORK_RESULT_SAVE_NEXT_WORK ;
	}
	
	public static void saveScreenWorkAlarms( TblTarea siguienteTarea , UserLogin usuario , int tipoFlujo , TblCuenta cuenta , TblAsset asset , EntityTransaction et , TblCampania campania )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// toma las alarmaas
		List< TblFormaAlarma > alarmas = siguienteTarea.getTblFormaAlarmas( ) ;
		
		if( alarmas == null )
			return ;
		
		System.out.println( "Siguiente Tarea : " + siguienteTarea.getNombre( ) ) ;
		
		// obtiene de la tarea la fecha limite
		Timestamp fechaLimite = siguienteTarea.getFechaLimite( ) ;
		System.out.println( "Fecha Limite: " + fechaLimite ) ;
		// fecha un anio despues de hoy
		Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
		
		// recorre
		for( TblFormaAlarma al : alarmas )
		{
			// en caso de que sea una alarma de pantalla o ambas
			// en caso de que se trate de correo
			if( al.getTipo( ) == 1 || al.getStatus() == 0 )
				// al siguiente
				continue;
			
			TblAlerta alerta = al.getTblAlerta( ) ;
                        
                        // toma las notificaciones para la alerta    
                        List< TblNotificacion > noti = alerta.getTblNotificacions( ) ;
			
			// toma el rol al que se aplica la alarma
			TblRole role = al.getTblRole( ) ;
			
			// toma el nivel al que se aplica la alarma
			TblNivel nivel = al.getTblNivel( ) ;
			
			// toma los usuarios de ese rol y el nivel
			List< TblUsuario > users = getAllActiveUsersFromRoleAndLevel( role , nivel ) ;
			
			int cveCuenta = -1 ;
			
			if( cuenta != null )
				cveCuenta = cuenta.getCveCuenta( ) ;
			
			// recorre los usuarios
			for( TblUsuario user : users )
			{
				// si es de tipo campania
				if( tipoFlujo == 3 )
				{
					// verifica que el usuario pertenezca a la cuenta dada
					// en caso de que no haya cuenta
					if( cuenta == null ) {
                                            // recorre las notificaciones
                                            for ( TblNotificacion nt : noti ) {
                                                
                                                saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt , cuenta ) ;
                                                
                                            }
                                            
                                        }
						
					// en caso de que si haya cuenta
					else
					{
						List< TblCuenta > cuentas = user.getTblCuentas( ) ;
						
						// recorre
						for( TblCuenta c : cuentas )
						{
							// en caso de que no sea activo
							if( c.getStatus( ) == 0 )
								continue ;
							
							// en caso de que coincidan las claves
							if( c.getCveCuenta( ) == cveCuenta )
							{
								// el usuario si pertenece a la cuenta por lo que si se agrega
                                                            // recorre las notificaciones
                                                            for ( TblNotificacion nt : noti ) {
                                                                saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt , cuenta ) ;
                                                            }
								
								
								// quiebra el ciclo
								break ;
							}
						}
					}
				}
				// si no es de tipo campania
				else
				{
					String texto = alerta.getTexto( ) ;
					texto = texto.replaceAll( "[usuario]" , user.getNombre( ) ) ;
					texto = texto.replaceAll( "[tarea]" , siguienteTarea.getNombre( ) ) ;
                                        // recorre las notificaciones
                                        for ( TblNotificacion nt : noti ) {
                                            saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt , cuenta ) ;
                                        }
					
//					saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , siguienteTarea , asset , alerta.getTexto( ) ) , fechaLimite , fechaProlongada , fechaProlongada, et ) ;
//					saveNewAlertByUser( alerta , user , alerta.getNombre( ) , texto , fechaLimite , fechaProlongada , fechaProlongada, et ) ;
				}
			}
		}
	}
	
	public static void saveScreenWorkAlarmsFlujo( TblTarea siguienteTarea , UserLogin usuario , int tipoFlujo , TblCuenta cuenta , TblAsset asset , EntityTransaction et , TblCampania campania )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// toma las alarmaas
		List< TblFormaAlarma > alarmas = siguienteTarea.getTblFormaAlarmas( ) ;
		
		if( alarmas == null )
			return ;
		
		System.out.println( "Siguiente Tarea : " + siguienteTarea.getNombre( ) ) ;
		
		// obtiene de la tarea la fecha limite
		Timestamp fechaLimite = siguienteTarea.getFechaLimite( ) ;
		System.out.println( "Fecha Limite: " + fechaLimite ) ;
		// fecha un anio despues de hoy
		Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
		
		// recorre
		for( TblFormaAlarma al : alarmas )
		{
			// en caso de que sea una alarma de pantalla o ambas
			// en caso de que se trate de correo
			if( al.getTipo( ) == 1 )
				// al siguiente
				continue;
			
			TblAlerta alerta = al.getTblAlerta( ) ;
                        
                        // toma las notificaciones para la alerta    
                        List< TblNotificacion > noti = alerta.getTblNotificacions( ) ;
			
			// toma el rol al que se aplica la alarma
			TblRole role = al.getTblRole( ) ;
			
			// toma el nivel al que se aplica la alarma
			TblNivel nivel = al.getTblNivel( ) ;
			
			// toma los usuarios de ese rol y el nivel
			List< TblUsuario > users = getAllActiveUsersFromRoleAndLevel( role , nivel ) ;
			
			int cveCuenta = -1 ;
			
			if( cuenta != null )
				cveCuenta = cuenta.getCveCuenta( ) ;
			
			// recorre los usuarios
			for( TblUsuario user : users )
			{
				// si es de tipo campania
				if( tipoFlujo == 3 )
				{
					// verifica que el usuario pertenezca a la cuenta dada
					// en caso de que no haya cuenta
					if( cuenta == null ) {
                                             // recorre las notificaciones
                                            for ( TblNotificacion nt : noti ) {
                                                
                                                saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt , cuenta ) ;
                                                
                                            }
                                            //saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) ) , fechaLimite , fechaProlongada , fechaProlongada, et ) ;
                                        }
						
					// en caso de que si haya cuenta
					else
					{
						List< TblCuenta > cuentas = user.getTblCuentas( ) ;
						
						// recorre
						for( TblCuenta c : cuentas )
						{
							// en caso de que no sea activo
							if( c.getStatus( ) == 0 )
								continue ;
							
							// en caso de que coincidan las claves
							if( c.getCveCuenta( ) == cveCuenta )
							{
								// el usuario si pertenece a la cuenta por lo que si se agrega
                                                                // recorre las notificaciones
                                                                for ( TblNotificacion nt : noti ) {
                                                
                                                                    saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt, cuenta ) ;
                                                
                                                                }
						//		saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) ) , fechaLimite , fechaProlongada , fechaProlongada, et ) ;
								
								// quiebra el ciclo
								break ;
							}
						}
					}
				}
				// si no es de tipo campania
				else
				{
					String texto = alerta.getTexto( ) ;
					texto = texto.replaceAll( "[usuario]" , user.getNombre( ) ) ;
					texto = texto.replaceAll( "[tarea]" , siguienteTarea.getNombre( ) ) ;
//					saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) ) , fechaLimite , fechaProlongada , fechaProlongada, et ) ;
					 // recorre las notificaciones
                                            for ( TblNotificacion nt : noti ) {
                                                
                                                saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt , cuenta ) ;
                                                
                                            }
//                                        saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , siguienteTarea , asset , alerta.getTexto( ) ) , fechaLimite , fechaProlongada , fechaProlongada, et ) ;
//					saveNewAlertByUser( alerta , user , alerta.getNombre( ) , texto , fechaLimite , fechaProlongada , fechaProlongada, et ) ;
				}
			}
		}
	}
	
	public static void sendMailWorkAlarms( TblTarea siguienteTarea , UserLogin usuario , int tipoFlujo , TblCuenta cuenta , TblAsset asset , EntityTransaction et , TblCampania campania )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// toma las alarmaas
		List< TblFormaAlarma > alarmas = siguienteTarea.getTblFormaAlarmas( ) ;
		
		if( alarmas == null )
			return ;
		
		// obtiene de la tarea la fecha limite
		Timestamp fechaLimite = siguienteTarea.getFechaLimite( ) ;
		// fecha un anio despues de hoy
		Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
		
		// recorre
		for( TblFormaAlarma al : alarmas )
		{
			// en caso de que sea una alarma de pantalla
			if( al.getTipo( ) == 2 )
				// al siguiente
				continue;
			
			TblAlerta alerta = al.getTblAlerta( ) ;
			
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			// toma el rol al que se aplica la alarma
			TblRole role = al.getTblRole( ) ;
			
			// toma el nivel al que se aplica la alarma
			TblNivel nivel = al.getTblNivel( ) ;
			
			// toma los usuarios de ese rol y el nivel
			List< TblUsuario > users = getAllActiveUsersFromRoleAndLevel( role , nivel ) ;
			
			int cveCuenta = -1 ;
			
			if( cuenta != null )
				cveCuenta = cuenta.getCveCuenta( ) ;
			
			// recorre los usuarios
			for( TblUsuario user : users )
			{
				// toma el mail del usuario
				String mail = user.getEmail( ) ;
				
				// si es de tipo campania
				if( tipoFlujo == 3 )
				{
					// verifica que el usuario pertenezca a la cuenta dada
					// en caso de que no haya cuenta
					if( cuenta == null )
						// envia correo electronico a dicho mail con el texto indicado y el nombre de la alerta
						MCUtil.sendMail( mail , nombre , MCUtil.getTextFormated( usuario , user , cuenta , asset , texto , campania ) ) ;
					// en caso de que si haya cuenta
					else
					{
						List< TblCuenta > cuentas = user.getTblCuentas( ) ;
						
						// recorre
						for( TblCuenta c : cuentas )
						{
							// en caso de que no sea activo
							if( c.getStatus( ) == 0 )
								continue ;
							
							// en caso de que coincidan las claves
							if( c.getCveCuenta( ) == cveCuenta )
							{
								// envia correo electronico a dicho mail con el texto indicado y el nombre de la alerta
								MCUtil.sendMail( mail , nombre , MCUtil.getTextFormated( usuario , user , cuenta , asset , texto , campania ) ) ;
								
								// quiebra el ciclo
								break ;
							}
						}
					}
				}
				// si no es de tipo campania
				else
					// envia correo electronico a dicho mail con el texto indicado y el nombre de la alerta
					MCUtil.sendMail( mail , nombre , MCUtil.getTextFormated( usuario , user , cuenta , asset , texto , campania ) ) ;
			}
		}
	}
	
	public static void saveScreenWorkExitAlerts( TblTarea tarea , TblFormaSalida salida , UserLogin usuario , int tipoFlujo , TblCuenta cuenta , TblAsset asset , EntityTransaction et , TblCampania campania )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// toma las alarmaas
		List< TblFormaAlerta > alertas = getAllActiveFormaAlertaWithTareaAndExit( tarea.getCveTarea( ) , salida.getCveSalida( ) ) ;
		
		// obtiene de la tarea la fecha limite
		Timestamp fechaLimite = tarea.getFechaLimite( ) ;
		// fecha un anio despues de hoy
		Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
		
		// recorre
		for( TblFormaAlerta al : alertas )
		{
			// en caso de que sea una alarma de pantalla o ambas
			// en caso de que se trate de correo
			if( al.getTipo( ) == 1 )
				// al siguiente
				continue;
			
			TblAlerta alerta = al.getTblAlerta( ) ;
                        
                        // toma las notificaciones de las alertas
                        List< TblNotificacion > noti = alerta.getTblNotificacions( ) ;
			//-- validar status
			// toma el rol al que se aplica la alarma
			TblRole role = al.getTblRole( ) ;
			
			// toma el nivel al que se aplica la alarma
			TblNivel nivel = al.getTblNivel( ) ;
			
			// toma los usuarios de ese rol y el nivel
			List< TblUsuario > users = getAllActiveUsersFromRoleAndLevel( role , nivel ) ;
			
			int cveCuenta = -1 ;
			
			if( cuenta != null )
				cveCuenta = cuenta.getCveCuenta( ) ;
			
			// recorre los usuarios
			for( TblUsuario user : users )
			{
                            if( user.getStatus( ) == 0 )
                                continue ;
                            
                            if( user.getTblPais( ) == null )
                                continue ;
                            
                            if( user.getTblPais( ).getCvePais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ).getCvePais( ) )
                                continue ;
                            
				// si es de tipo campania
				if( tipoFlujo == 3 )
				{
					// verifica que el usuario pertenezca a la cuenta dada
					// en caso de que no haya cuenta
					if( cuenta == null ) {
                                            saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , null , cuenta ) ;
                                        }					
					// en caso de que si haya cuenta
					else
					{
						List< TblCuenta > cuentas = user.getTblCuentas( ) ;
						
						// recorre
						for( TblCuenta c : cuentas )
						{
							// en caso de que no sea activo
							if( c.getStatus( ) == 0 )
								continue ;
							
							// en caso de que coincidan las claves
							if( c.getCveCuenta( ) == cveCuenta )
							{
                                                            saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , null , cuenta ) ;
                                                            break ;
							}
						}
					}
				}
				// si es de tipo campania
                                else {                                 
                                    
                                    // recorre las notificaciones
                                    for ( TblNotificacion nt : noti )
                                    {
                                        if ( nt.getStatus() == 0 )
                                            continue ;
                                        
                                        int cveRole = nt.getTblRole( ).getCveRole( ) ;
                                        if( cveRole == 2 || cveRole == 6 || cveRole == 7 || cveRole == 8 )
                                        {
                                            saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt , cuenta ) ;
                                        }else if( cveRole == 5 ) {
                                            
                                            List< TblTipoCuenta > tcu = user.getTblTipoCuentas( ) ;
                                            
                                            if( cuenta.getTblTipoCuenta( ) == tcu.get( 0 ) )
                                            {
                                                saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt , cuenta ) ;
                                            }
                                            
                                        }else {
                                            
                                            List< TblCuenta > cuentas = user.getTblCuentas( ) ;
                                            // recorre
                                            for( TblCuenta c : cuentas ) {

                                            if( c.getStatus( ) == 0 )
                                                continue ;
                                            
                                            if( c.getCveCuenta( ) == cveCuenta )
                                            {
                                                saveNewAlertByUser( alerta , user , alerta.getNombre( ) , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) , fechaLimite , fechaProlongada , fechaProlongada, et , nt , cuenta ) ;
                                            }
                                            
                                            }
                                            
                                        }

                                    }
                                    
                                }
			}
		}
	}
	
	public static void sendMailWorkExitAlerts( TblTarea tarea , TblFormaSalida salida , UserLogin usuario , int tipoFlujo , TblCuenta cuenta , TblAsset asset , EntityTransaction et , TblCampania campania )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// toma las alarmaas
		List< TblFormaAlerta > alertas = getAllActiveFormaAlertaWithTareaAndExit( tarea.getCveTarea( ) , salida.getCveSalida( ) ) ;
		
		// obtiene de la tarea la fecha limite
		Timestamp fechaLimite = tarea.getFechaLimite( ) ;
		// fecha un anio despues de hoy
		Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
		
		// recorre
		for( TblFormaAlerta al : alertas )
		{
			// en caso de que sea una alarma de pantalla o ambas
			// en caso de que se trate de correo
			if( al.getTipo( ) == 2 )
				// al siguiente
				continue;
			
			TblAlerta alerta = al.getTblAlerta( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			// toma el rol al que se aplica la alarma
			TblRole role = al.getTblRole( ) ;
			
			// toma el nivel al que se aplica la alarma
			TblNivel nivel = al.getTblNivel( ) ;
			
			// toma los usuarios de ese rol y el nivel
			List< TblUsuario > users = getAllActiveUsersFromRoleAndLevel( role , nivel ) ;
			
			int cveCuenta = -1 ;
			
			if( cuenta != null )
				cveCuenta = cuenta.getCveCuenta( ) ;
			
			// recorre los usuarios
			for( TblUsuario user : users )
			{
                            if( user.getStatus( ) == 0 )
                                continue ;
                            
                            if( user.getTblPais( ).getCvePais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ).getCvePais( ) )
                                continue ;
                            
				// si es de tipo campania
				if( tipoFlujo == 3 )
				{
					// verifica que el usuario pertenezca a la cuenta dada
					// en caso de que no haya cuenta
					if( cuenta == null )
						MCUtil.sendMailForNotification( user.getEmail( ) , nombre , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) ) ;
					// en caso de que si haya cuenta
					else
					{
						List< TblCuenta > cuentas = user.getTblCuentas( ) ;
						
						// recorre
						for( TblCuenta c : cuentas )
						{
							// en caso de que no sea activo
							if( c.getStatus( ) == 0 )
								continue ;
							
							// en caso de que coincidan las claves
							if( c.getCveCuenta( ) == cveCuenta )
							{
								MCUtil.sendMailForNotification( user.getEmail( ) , nombre , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) ) ;
								
								String email = al.getEmail( ) ;
								
								if( email != null && email.trim( ).length( ) > 0 )
									MCUtil.sendMailForNotification( email , nombre , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) ) ;
								
								// quiebra el ciclo
								break ;
							}
						}
					}
				}
				// si no es de tipo campania
				else
					MCUtil.sendMailForNotification( user.getEmail( ) , nombre , MCUtil.getTextFormated( usuario , user , cuenta , asset , alerta.getTexto( ) , campania ) ) ;
			}
		}
	}
	
	public static List< TblCuenta > getAllActiveBindCounts( int cveCount )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que la cuenta exista
		TblCuenta cuenta = findCountById( cveCount ) ;
		
		if( cuenta == null )
			throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.cuenta.crear.CountIdNotExist" , cveCount ) ,
						MCUtil.MASTERCARD_ERROR_CODE_COUNT_PACKAGEASIGNED_COUNT_ID_NOT_EXITS , 
						null ) ;
		
		// ping( 251 ) ;
		
		// tom ael tipo de cuenta
		TblTipoCuenta tipoCuenta = cuenta.getTblTipoCuenta( ) ;
		
		// toma las cuentas
		List< TblCuenta > cuentas = tipoCuenta.getTblCuentas( ) ;
		
		List< TblCuenta > cuentasHermanas = new ArrayList< TblCuenta >( ) ;
		
		// recorre en caso de no null
		if( cuentas == null || cuentas.size( ) < 2 )
			return cuentasHermanas ;
		
		for( TblCuenta c : cuentas )
		{
			// en caso de estatus 0
			if( c.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// revisa que no sea el mismo cve
			if( c.getCveCuenta( ) != cveCount )
				cuentasHermanas.add( c ) ;
		}
		
		return cuentasHermanas ;
	}
        
        public static List< TblPreimplementacionFlujoautRoles > findAllFindAllFlowsAuthorizationRolsByPreimplementacion( int cvePreimplementation )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{		
						
			
			Query q = em.createNamedQuery( "FlowsAut.FindAllFlowsAuthorizationRolsByPreimplementacion" ) ;
			q.setParameter( "cvePreimplementacion" , cvePreimplementation ) ;
			List< TblPreimplementacionFlujoautRoles > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblPreimplementacionFlujoautRoles >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblPreimplementacionFlujoautRoles >( ) ;
		}
	}	
	
	public static List< TblTareaPreimplementacion > findAllWorksForRoleAndStatus( int cveRole , int ejecutado )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 252 ) ;
			
			System.out.println( "MasterCardDAO.java: findAllWorksForRoleAndStatus( " + cveRole + " , " + ejecutado + " )" ) ;
			
			Query q = em.createNamedQuery( "MenuTareas.FindAllWorksForRoleAndStatus" ) ;
			q.setParameter( "cveRole" , cveRole ) ;
			q.setParameter( "ejecutado" , ejecutado ) ;
			List< TblTareaPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblTareaPreimplementacion >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTareaPreimplementacion >( ) ;
		}
	}
	
	public static List< TblTareaPreimplementacion > findAllWorksNotExecuted( )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 253 ) ;
			
			Query q = em.createNamedQuery( "WorkPreimplementations.FindAllActiveAndNotExecutedWorkPreimplementationStatic" ) ;
			List< TblTareaPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null )
				return new ArrayList< TblTareaPreimplementacion >( ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTareaPreimplementacion >( ) ;
		}
	}
	
	public static TblTareaPreimplementacion findTareaPreimplementacionById( int cve )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// verifica que nombre no este vacio
		if( cve < 1 )
			return null ;
		
		
		// obtiene el registro
		TblTareaPreimplementacion tc = em.find( TblTareaPreimplementacion.class , new Integer( cve ) ) ;
		
		em.refresh( tc ) ;
		
		return tc ;
	}
	
	public static List< TblTareaPreimplementacion > findTareaPreimplementacionByPreimplementacionAndTareaAndAssetAndExecutedAndStatusAndAllActive( 
			int cvePreimplementacion , int cveAsset , int cveTarea , int ejecutado )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 255 ) ;
			
			Query q = em.createNamedQuery( "WorkPreimplementations.FindTareaPreimplementacionByPreimplementacionAndTareaAndAssetAndExecutedAndStatusAndAllActive" ) ;
			q.setParameter( "ejecutado" , new Integer( ejecutado ) ) ;
			q.setParameter( "cvePreimplementacion" , new Integer( cvePreimplementacion ) ) ;
			q.setParameter( "cveTarea" , new Integer( cveTarea ) ) ;
			q.setParameter( "cveAsset" , new Integer( cveAsset ) ) ;
			
			List< TblTareaPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null || l.size( ) == 0 )
				return new ArrayList< TblTareaPreimplementacion >( ) ;
			
			// recorre para refrescar
			for( TblTareaPreimplementacion ttp : l )
				em.refresh( ttp ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTareaPreimplementacion >( ) ;
		}
	}
	
	public static List< TblTareaPreimplementacion > findTareaPreimplementacionByPreimplementacionAndAssetAndExecutedAndStatusAndAllActive( 
			int cvePreimplementacion , int cveAsset , int ejecutado )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 256 ) ;
			
			Query q = em.createNamedQuery( "WorkPreimplementations.FindTareaPreimplementacionByPreimplementacionAndAssetAndExecutedAndStatusAndAllActive" ) ;
			q.setParameter( "ejecutado" , new Integer( ejecutado ) ) ;
			q.setParameter( "cvePreimplementacion" , new Integer( cvePreimplementacion ) ) ;
			q.setParameter( "cveAsset" , new Integer( cveAsset ) ) ;
			
			List< TblTareaPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null || l.size( ) == 0 )
				return new ArrayList< TblTareaPreimplementacion >( ) ;
			
			// recorre para refrescar
			for( TblTareaPreimplementacion ttp : l )
				em.refresh( ttp ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTareaPreimplementacion >( ) ;
		}
	}
        
        public static List< TblTareaPreimplementacion > findAllTareaPreimplementacionByPreimplementacionAndWork( 
			int cvePreimplementacion )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			Query q = em.createNamedQuery( "WorkPreimplementations.FindAllTareaPreimplementacionByPreimplementacionAndWork" ) ;
			q.setParameter( "cvePreimplementacion" , new Integer( cvePreimplementacion ) ) ;			
			List< TblTareaPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null || l.size( ) == 0 )
				return new ArrayList< TblTareaPreimplementacion >( ) ;
			
			// recorre para refrescar
			for( TblTareaPreimplementacion ttp : l )
				em.refresh( ttp ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTareaPreimplementacion >( ) ;
		}
	}
        
        public static List< TblTareaPreimplementacion > findAllTareaPreimplementacionByPreimplementacionByCampaign( 
			int cveCampana )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			Query q = em.createNamedQuery( "WorkPreimplementations.FindAllTareaPreimplementacionByPreimplementacionByCampaign" ) ;
			q.setParameter( "cveCampana" , new Integer( cveCampana ) ) ;			
			List< TblTareaPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null || l.size( ) == 0 )
				return new ArrayList< TblTareaPreimplementacion >( ) ;
			
			// recorre para refrescar
			for( TblTareaPreimplementacion ttp : l )
				em.refresh( ttp ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTareaPreimplementacion >( ) ;
		}
	}
        
        public static List< TblTareaPreimplementacion > findAllTareaPreimplementacionByPreimplementacionByEjecutado( int cvePreimplementacion , 
			int ejecutado )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			Query q = em.createNamedQuery( "WorkPreimplementations.FindAllTareaPreimplementacionByPreimplementacionAndEjecutado" ) ;
			q.setParameter( "cvePreimplementacion" , cvePreimplementacion ) ;
                        q.setParameter( "ejecutado" , ejecutado ) ;
			List< TblTareaPreimplementacion > l = q.getResultList( ) ;
			
			// en caso de que no haya resultados
			if( l == null || l.size( ) == 0 )
				return new ArrayList< TblTareaPreimplementacion >( ) ;
			
			// recorre para refrescar
			for( TblTareaPreimplementacion ttp : l )
				em.refresh( ttp ) ;
			
			// en caso de que si haya resultados
			return l ;
		}catch( Exception e )
		{
			return new ArrayList< TblTareaPreimplementacion >( ) ;
		}
	}
	
	public static List< TblTareaFlujo > findAllTblTareaFlujoWithWorkInAndExit( int cveTarea , String nombreSalida )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 257 ) ;
			
			Query q = em.createNamedQuery( "WorkFlow.FindAllTblTareaFlujoWithWorkInAndExit" ) ;
			q.setParameter( "cveTarea" , new Integer( cveTarea ) ) ;
			q.setParameter( "nombre" , nombreSalida ) ;
			List< TblTareaFlujo > res = q.getResultList( ) ;
			
			if( res == null )
				return new ArrayList< TblTareaFlujo >( ) ;
			
			// regresa res
			return res ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			return new ArrayList< TblTareaFlujo >( ) ;
		}
	}
        
        public static TblPreimplementacionFlujoautRoles FindFlowAuthorizationRolsByCondition( int cvePreimplementacion )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
						
			Query q = em.createNamedQuery( "FlowsAut.FindFlowAuthorizationRolsByCondition" ) ;
			q.setParameter( "cvePreimplementacion" , cvePreimplementacion ) ;
			List<TblPreimplementacionFlujoautRoles> l = q.getResultList( ) ;
			
			if( l == null )
				return new TblPreimplementacionFlujoautRoles( ) ;
                        
                        TblPreimplementacionFlujoautRoles res = l.get( 0 ) ;
			
			// regresa res
			return res ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			return new TblPreimplementacionFlujoautRoles( ) ;
		}
	}
	
	public static void saveFileBackup( String directory , String name , String content , int insideApp )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		if( name == null || content == null )
			return ;
		
		// ping( 258 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			TblFileRespaldo back = new TblFileRespaldo( ) ;
			
			System.out.println( "Coloca los archivos: " + name ) ;
			
			back.setDirectory( directory ) ;
			back.setContent( content ) ;
			back.setName( name ) ;
			back.setInsideApp( insideApp ) ;
			
			em.persist( back ) ;
			em.flush( ) ;
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.formsbackup.ErrorSavingBackup" , e.getMessage( ) ) ,
					MCUtil.MASTERCARD_ERROR_CODE_BACKUP_ERROR , 
					e ) ;
		}
	}
	
	public static List< TblFileRespaldo > getAllFileBackup( )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 259 ) ;
			
			Query q = em.createNamedQuery( "FileBackup.FindAllTblFileRespaldo" ) ;
			
			List< TblFileRespaldo > formas = q.getResultList( ) ;
			
			if( formas == null )
				return new ArrayList< TblFileRespaldo >( ) ;
			
			return formas ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.filesbackup.ErrorSavingBackup" , e.getMessage( ) ) ,
					MCUtil.MASTERCARD_ERROR_CODE_BACKUP_ERROR , 
					e ) ;
		}
	}
	
	public static void dropFileBackup( TblFileRespaldo form )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		if( form == null )
			return ;
		
		// ping( 260 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			em.remove( form ) ;
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.filesbackup.ErrorSavingBackup" , e.getMessage( ) ) ,
					MCUtil.MASTERCARD_ERROR_CODE_BACKUP_ERROR , 
					e ) ;
		}
	}
	
	public static void saveFormBackup( String name , String content )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		if( name == null || content == null )
			return ;
		
		// ping( 261 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			TblFormaRespaldo back = new TblFormaRespaldo( ) ;
			
			System.out.println( "Coloca los archivos: " + name ) ;
			
			back.setContent( content ) ;
			back.setName( name ) ;
			
			em.persist( back ) ;
			em.flush( ) ;
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.formsbackup.ErrorSavingBackup" , e.getMessage( ) ) ,
					MCUtil.MASTERCARD_ERROR_CODE_BACKUP_ERROR , 
					e ) ;
		}
	}
	
	public static List< TblFormaRespaldo > getAllFormBackup( )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 262 ) ;
			
			Query q = em.createNamedQuery( "FormBackup.FindAllTblFormaRespaldo" ) ;
			
			List< TblFormaRespaldo > formas = q.getResultList( ) ;
			
			if( formas == null )
				return new ArrayList< TblFormaRespaldo >( ) ;
			
			return formas ;
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.formsbackup.ErrorSavingBackup" , e.getMessage( ) ) ,
					MCUtil.MASTERCARD_ERROR_CODE_BACKUP_ERROR , 
					e ) ;
		}
	}
	
	public static void dropFormBackup( TblFormaRespaldo form )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		if( form == null )
			return ;
		
		// ping( 263 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			em.remove( form ) ;
			em.flush( ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.formsbackup.ErrorSavingBackup" , e.getMessage( ) ) ,
					MCUtil.MASTERCARD_ERROR_CODE_BACKUP_ERROR , 
					e ) ;
		}
	}
	
	
	public static void saveNewAlertByUser( TblAlerta alerta , TblUsuario usuario , String nombre , String texto , Timestamp fechaLimite , Timestamp fechaVista , Timestamp fechaEjecutada , TblNotificacion noti , TblCuenta cuen )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// agrega el tblAlertaUsuario
		TblAlertaUsuario tau = new TblAlertaUsuario( ) ;
		
		// llena los datos
		tau.setTblAlerta( alerta ) ;
		tau.setTblUsuario( usuario ) ;
		tau.setNombre( nombre ) ;
		tau.setTexto( texto ) ;
		tau.setFechaLimite( fechaLimite ) ;
		tau.setFechaVista( fechaVista ) ;
		tau.setFechaEjecutada( fechaEjecutada ) ;
		tau.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		tau.setStatus( ( byte ) 1 ) ;
		tau.setLeida( 1 ) ;
                tau.setTblNotificacion( noti ) ;
                if( cuen != null )
                    tau.setTblCuenta( cuen ) ;
		
//		// ping( 264 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			em.persist( tau ) ;
			em.flush( ) ;
			em.refresh( tau ) ;
			
			alerta.getTblAlertaUsuarios( ).add( tau ) ;
			em.merge( alerta ) ;
			em.flush( ) ;
//			em.refresh( alerta ) ;
			
			usuario.getTblAlertaUsuarios( ).add( tau ) ;
			em.merge( usuario ) ;
			em.flush( ) ;
//			em.refresh( usuario ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.notification.errors.ErrorRegNotification" , usuario.getNombre( ) , e.getMessage( ) ) ,
					MCUtil.MASTERCARD_ERROR_CODE_NOTIFICATION_ERROR , 
					e ) ;
		}
	}
	
	public static void saveNewAlertByUser( TblAlerta alerta , TblUsuario usuario , String nombre , String texto , Timestamp fechaLimite , Timestamp fechaVista , Timestamp fechaEjecutada , EntityTransaction et , TblNotificacion noti, TblCuenta cuent )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// agrega el tblAlertaUsuario
		TblAlertaUsuario tau = new TblAlertaUsuario( ) ;
		
//		System.out.println( "FechaLimite:\n\t" + fechaLimite ) ;
//		System.out.println( "FechaVisita:\n\t" + fechaVista ) ;
//		System.out.println( "FechaEjecutada:\n\t" + fechaEjecutada ) ;
//		
		if( fechaLimite == null )
		{
			GregorianCalendar gc = new GregorianCalendar( ) ;
			gc.set( Calendar.MONTH , 11 ) ;
			gc.set( Calendar.DAY_OF_MONTH , 31 ) ;
			fechaLimite = new Timestamp( gc.getTimeInMillis( ) ) ;
		}
		
		// llena los datos
		tau.setTblAlerta( alerta ) ;
		tau.setTblUsuario( usuario ) ;
		tau.setNombre( nombre ) ;
		tau.setTexto( texto ) ;
		tau.setFechaLimite( fechaLimite ) ;
		tau.setFechaVista( fechaVista ) ;
		tau.setFechaEjecutada( fechaEjecutada ) ;
		tau.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
		tau.setStatus( ( byte ) 1 ) ;
		tau.setLeida( 1 ) ; 
                tau.setTblNotificacion( noti ) ;
                if( cuent != null )
                    tau.setTblCuenta( cuent ) ;
		
		try
		{
			em.persist( tau ) ;
			em.flush( ) ;
			em.refresh( tau ) ;
			
			alerta.getTblAlertaUsuarios( ).add( tau ) ;
			em.merge( alerta ) ;
			em.flush( ) ;
//			em.refresh( alerta ) ;
			
			usuario.getTblAlertaUsuarios( ).add( tau ) ;
			em.merge( usuario ) ;
			em.flush( ) ;
//			em.refresh( usuario ) ;
			
		}catch( Exception e )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.notification.errors.ErrorRegNotification" , usuario.getNombre( ) , e.getMessage( ) ) ,
					MCUtil.MASTERCARD_ERROR_CODE_NOTIFICATION_ERROR , 
					e ) ;
		}
	}
	
	public static boolean markAlertAsReaded( int cveAlertaUsuario )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// ping( 265 ) ;
		
		TblAlertaUsuario alertaUsuario = em.find( TblAlertaUsuario.class , new Integer( cveAlertaUsuario ) ) ;
		
		// en caos de null
		if( alertaUsuario == null )
			return false ;
		
		// hace el cambio
		EntityTransaction et = em.getTransaction( ) ;
		
		try
		{
			et.begin( ) ;
			
			// cambia el status
			alertaUsuario.setLeida( 2 ) ;
			alertaUsuario.setFechaVista( new Timestamp( System.currentTimeMillis( ) ) ) ;
			
			em.merge( alertaUsuario ) ;
			em.flush( ) ;
//			em.refresh( alertaUsuario ) ;
			
			et.commit( ) ;
			
			return true ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			return false ;
		}
	}
        
        public static List< TblAlertaUsuario >  getNoLeidas( int cveUsuario ){
        try {
            init( ) ;
            EntityTransaction et = em.getTransaction( ) ;
                        et.begin( ) ;
                Query q = em.createNamedQuery( "Alerts.FindAllNotReadedAlertsByUserId" ) ;
                q.setParameter( "userId" , cveUsuario ) ;
                List< TblAlertaUsuario > res = q.getResultList();
                et.commit();
                
                if( res.size( ) > 0 )
                        // si existe
                        return res ;		
                
                // no existe
                return res = new ArrayList< TblAlertaUsuario >( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return new ArrayList< TblAlertaUsuario >( ) ;
            }
	}
        
        public static List< TblAlertaUsuario >  getLeidas( int cveUsuario ){
        try {
            init( ) ;
            EntityTransaction et = em.getTransaction( ) ;
                        et.begin( ) ;
                Query q = em.createNamedQuery( "Alerts.FindAllReadedAlertsByUserId" ) ;
                q.setParameter( "userId" , cveUsuario ) ;
                List< TblAlertaUsuario > res = q.getResultList();
                et.commit();
                
                if( res.size( ) > 0 )
                        // si existe
                        return res ;		
                
                // no existe
                return res = new ArrayList< TblAlertaUsuario >( ) ;
        } catch (MasterCardException ex) {
            Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace( ) ;
            return new ArrayList< TblAlertaUsuario >( ) ;
            }
	}        
	
	public static void refresh( Object obj )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		try
		{
			// ping( 266 ) ;
			
			em.refresh( obj ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
		}
	}
	
	public static TblPreimplementacion findTblPreimplementacion( int cveFlujo )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// ping( 267 ) ;
		
		return em.find( TblPreimplementacion.class , new Integer( cveFlujo ) ) ;
	}
	
	public static void stopPreimplementationFlow( int cveFlujo )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// ping( 268 ) ;
		
		// trae el flujo
		TblPreimplementacion preimplementation = em.find( TblPreimplementacion.class , new Integer( cveFlujo ) ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			// tres tareas
			// 0. Elimina el flujo
			// 1. eliminar tareas
			// 2. liberar assets
			// 3. eliminar alertas
			
			// eliminar flujo, bandera 3 de cancelado
			preimplementation.setBandera( ( byte ) 3 ) ;
			
			em.merge( preimplementation ) ;
			em.flush( ) ;
//			em.refresh( preimplementation ) ;
			
			// toma las tareas
			List< TblTareaPreimplementacion > tareas = preimplementation.getTblTareaPreimplementacions( ) ;
			
			// recorre
			for( TblTareaPreimplementacion tareaPre : tareas )
			{
				// cambia ejecutado a 10, para que no las tome en cuenta
				tareaPre.setEjecutado( ( byte ) 10 ) ;
				
				// acutaliza
				em.merge( tareaPre ) ;
				em.flush( ) ;
//				em.refresh( tareaPre ) ;
			}
			
			
			// toma los assets
			List< TblAsset > assets = preimplementation.getTblAssets( ) ;
			
			// recorre los assets
			for( TblAsset asset : assets )
			{
				// elimina del asset
				asset.getTblPreimplementacions( ).remove( preimplementation ) ;
				
				em.merge( asset ) ;
				em.flush( ) ;
//				em.refresh( asset ) ;
			}
			
			// elimina los assets
			preimplementation.getTblAssets( ).clear( ) ;
			
			em.merge( preimplementation ) ;
			em.flush( ) ;
//			em.refresh( preimplementation ) ;
			
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.implementation.stop.errors.ErrorStopingPreimplementation" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_PREIMPLEMENTATION_ERROR_STOP_PREIM , 
					e ) ;
		}
	}
	
	
	public static int processCotizaServicioFormOne( UserLogin user , int[ ] servicios , String[ ] comentarios , String comentario , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
                String texto = "" ;
		
		// verifica los servicios
		if( servicios == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoServicesSelected" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_SERVICE_SELECTED , 
					null ) ;
		
		// en caso de que no vengan la misma cantidad de comentarios
		if( comentarios != null && servicios.length != comentarios.length )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ServicesLengthNotEqualComents" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_SERVICES_NOT_EQUAL_COMENTS , 
					null ) ;
		
		if( comentarios == null )
		{
			comentarios = new String[ servicios.length ] ;
			
			for( int i = 0 ; i < comentarios.length ; i++ )
				comentarios[ i ] = "" ;
		}
		
		// toma los servicios
		TblServicio[ ] services = new TblServicio[ servicios.length ] ;
		
		int index = 0 ;
		
		// recorre los servicios
		for( int cveServicio : servicios )
		{
			// buscar
			TblServicio serv = findServiceById( cveServicio ) ;
			
			// en caos de null
			if( serv == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ServicesNotExist" , cveServicio ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_SERVICE_NOT_EXIST , 
						null ) ;
			
			// en casod eque no sea activo
			if( serv.getStatus( ) == 0 )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ServicesNotActive" , cveServicio ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_SERVICE_NOT_ACTIVE , 
						null ) ;
			
			// guarda en services
			services[ index++ ] = serv ;
		}
		
		// ya tiene los servicios
		
		// ping( 269 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// crea registro en tabla tbl_preimplementacion_cotiza
			TblPreimplementacionCotiza cotizacion = new TblPreimplementacionCotiza( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			cotizacion.setBandera( ( byte ) 1 ) ;
			cotizacion.setFechaAlta( now ) ;
			cotizacion.setStatus( ( byte ) 1 ) ;
			cotizacion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
			cotizacion.setTotal( 0.0F ) ;
			cotizacion.setTxtAgencia( "" ) ;
			cotizacion.setTxtSolicita( ( comentario == null ? "" : comentario ) ) ;
			cotizacion.setArchivoCotizacion( "" ) ;
			cotizacion.setTxtHistorial( ( comentario == null ? user.getTblUsuario( ).getNombre( ) + ": " : user.getTblUsuario( ).getNombre( ) + ": " + comentario ) ) ;
			
			em.persist( cotizacion ) ;
			em.flush( ) ;
			em.refresh( cotizacion ) ;
			
			tblTareaPreimplementacion.getTblPreimplementacionCotizas( ).add( cotizacion ) ;
			
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
                        
			index = 0 ;
			
			// coloca todos los comentarios de los servicios                        
                            for( TblServicio servicio : services )
                            {
                                    TblPreimplementacionCotizacionServicio cotizaServicio = new TblPreimplementacionCotizacionServicio( ) ;

                                    // llave
                                    TblPreimplementacionCotizacionServicioPK pk = new TblPreimplementacionCotizacionServicioPK( ) ;
                                    pk.setCveCotizacion( cotizacion.getCveCotizacion( ) ) ;
                                    pk.setCveServicio( servicio.getCveServicio( ) ) ;

                                    String coment = comentarios[ index++ ] ;

                                    if( coment == null )
                                            coment = "" ;

                                    // coloca llave
                                    cotizaServicio.setId( pk ) ;
                                    cotizaServicio.setComentarios( coment ) ;
                                    cotizaServicio.setStatus( ( byte ) 1 ) ;
                                    cotizaServicio.setTblPreimplementacionCotiza( cotizacion ) ;
                                    cotizaServicio.setTblServicio( servicio ) ;
                                    cotizaServicio.setPrecio( 0.0F ) ;
                                    cotizaServicio.setPrecioD( 0.0F ) ;

                                    em.persist( cotizaServicio ) ;
                                    em.flush( ) ;
                                    em.refresh( cotizaServicio ) ;

                                    cotizacion.getTblPreimplementacionCotizacionServicios( ).add( cotizaServicio ) ;

                                    em.merge( cotizacion ) ;
                                    em.flush( ) ;
                                    em.refresh( cotizacion ) ;

                                    servicio.getTblPreimplementacionCotizacionServicios( ).add( cotizaServicio ) ;

                                    em.merge( servicio ) ;
                                    em.flush( ) ;
//                                    em.refresh( servicio ) ;
                            }
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , texto , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
//	public static int processCampaignFlowSreen1A( UserLogin user , FormFile bc , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
        public static int processCampaignFlowSreen1A( UserLogin user , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
                int result = -1 ;
                String texto = "" ; 
                
                // verifica los servicios
//		if( bc == null )
//			throw new MasterCardException( 
//					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ThereIsNoFiles" ) , 
//					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_NO_FILE_EXIST , 
//					null ) ;
                
                EntityTransaction et = em.getTransaction( ) ;
                
                try
                {
                    
                    int cveCampania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ).getCveCampania( ) ;
                    
                    et.begin( ) ;
			
			// toma la campania
			TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
			
			// en caso de null
			if( campania == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignNotExist" , cveCampania ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
						null ) ;
			
			// cambia la bandera
			campania.setBandera( ( byte ) 1 ) ;
//			campania.setBc( bc.getFileName() ) ;
                        campania.setBc( "NoSeUsa" ) ;
			
			// actualiza
			em.merge( campania ) ;
			em.flush( ) ;
//			em.refresh( campania ) ;
			
			// lanza flujo de assets
			
//                        throwCampaign( user , campania , et ) ;no lo lanza aqui, lo hace al crear una campaña
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , texto , nombreSalida, user.getCveUsuario( ) , et ) ;
                        
                        // lanza notificacion
//			NotificationUtil.throwNotificationTypeAuthorizeCampaign( MasterCardDAO.findCampaignById( cveCampania ) , et ) ;
			
			et.commit( ) ;
                    
                }catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;                
                
        }
        
        public static int processCampaignFlowResults( UserLogin user , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida , java.math.BigDecimal ressult ,
                                                      List< TblCampaniaProductoAdq > tblCampaniaProductoAdq  )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
                int result = -1 ;
                String texto = "" ;                 
                
                EntityTransaction et = em.getTransaction( ) ;
                
                try
                {
                    
                    int cveCampania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ).getCveCampania( ) ;
                    
                    et.begin( ) ;
			
                        if( tblCampaniaProductoAdq.isEmpty( ) )
                        {
                            // toma la campania
                            TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;

                            // en caso de null
                            if( campania == null )
                                    throw new MasterCardException( 
                                                    MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignNotExist" , cveCampania ) , 
                                                    MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
                                                    null ) ;

                                // apunta el resultado
                            campania.setResultado( ressult ) ;

                            // actualiza
                            em.merge( campania ) ;
                            em.flush( ) ;
//                            em.refresh( campania ) ;
                            
                        } else
                        {
                            
                            // toma todos los registros correspondientes de tblCampaniaProductoAdq
                            List< TblCampaniaProductoAdq > listProductoAdq = 
                                    MasterCardDAO.getAllActiveCampaignProdAdqByCampaingId( cveCampania ) ;
                            
                            for( TblCampaniaProductoAdq registrosBD : listProductoAdq )
                            {
                                // Datos de formulario para guardar
                                for( TblCampaniaProductoAdq datosForma : tblCampaniaProductoAdq )
                                {
                                    // COMPARA IGUALDAD EN CAMPAÑA PRODUCTO Y MES DE LOS REGISTROS
                                    if( ( datosForma.getTblCampania( ).getCveCampania( ) == registrosBD.getTblCampania( ).getCveCampania( ) )
                                        && ( datosForma.getTblProducto( ).getCveProducto( ) == registrosBD.getTblProducto( ).getCveProducto( ) )
                                        && ( datosForma.getMes( ) == registrosBD.getMes( ) ) )
                                    {
                                        // SI ES CORRECTA LA VALIDACION ACTUALIZA EL RESULTADO
                                        registrosBD.setResultado( datosForma.getResultado( ) ) ;
                                                                                
                                        // actualiza
                                        em.merge( registrosBD ) ;
                                        em.flush( ) ;
//                                        em.refresh( registrosBD ) ;
                                    }
                                }
                            }
                            
                        }
			
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , texto , nombreSalida, user.getCveUsuario( ) , et ) ;
                        			
			et.commit( ) ;
                    
                }catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;                
                
        }
        
        public static int processCampaignFlowSreen1B( UserLogin user , FormFile contrato , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
                throws
			MasterCardException
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
                int result = -1 ;
                String texto = "" ;
                
                // verifica los servicios
		if( contrato == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ThereIsNoFiles" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_NO_FILE_EXIST , 
					null ) ;
                
                EntityTransaction et = em.getTransaction( ) ;
                
                try
                {
                    
                    int cveCampania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ).getCveCampania( ) ;
                    
                    et.begin( ) ;
			
			// toma la campania
			TblCampania campania = em.find( TblCampania.class , new Integer( cveCampania ) ) ;
			
			// en caso de null
			if( campania == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.CampaignNotExist" , cveCampania ) , 
						MCUtil.MASTERCARD_ERROR_CODE_CAMPAIGN_ID_NOT_EXIST , 
						null ) ;
			
			// cambia la bandera
			campania.setBandera( ( byte ) 1 ) ;
			//campania.setBc( contrato.getFileName() ) ;
                        campania.setContrato( contrato.getFileName() );
			
			// actualiza
			em.merge( campania ) ;
			em.flush( ) ;
//			em.refresh( campania ) ;
			
			// lanza flujo de assets
			
//                        throwCampaign( user , campania , et ) ;no lo lanza aqui, lo hace al crear una campaña
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , texto , nombreSalida, user.getCveUsuario( ) , et ) ;
                        
			et.commit( ) ;
                    
                }catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;                
                
        }
        
        public static int processCampaignFlowSreenWinnersReject( UserLogin user , FlowProcessForm forma , String comentarios , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
				
		// empieza transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			// realiza commit
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ErrorProcessingScreen2Rejected" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_ERROR_PROCESING_SCREEN_2_REJECT , 
					e ) ;
		}
		
		return result ;
		
	}
        
        public static int processCampaignFlowSreenWinnerAuthorize( UserLogin user , FlowProcessForm forma , String comentarios , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
                String texto = "" ;				
		
		// empieza transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
						
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , texto , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			// realiza commit
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ErrorProcessingScreen2Rejected" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_ERROR_PROCESING_SCREEN_2_REJECT , 
					e ) ;
		}
		
		return result ;

	}
        
        public static int processCampaignFlowSreen1( UserLogin user , List< FormFile > archivos , String comentarios , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// verifica los servicios
		if( archivos == null || archivos.size( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ThereIsNoFiles" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_NO_FILE_EXIST , 
					null ) ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ya tiene los archivos
		
		// ping( 270 ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			int cveCampania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ).getCveCampania( ) ;
			
			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
			// crea registro en tabla tbl_preimplementacion_cotiza
			TblEjecucionMaterial ejecucion = new TblEjecucionMaterial( ) ;
			
			ejecucion.setBandera( ( byte ) 2 ) ;
			ejecucion.setFechaAlta( now ) ;
			ejecucion.setStatus( ( byte ) 1 ) ;
			ejecucion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
			ejecucion.setTxtAgencia( "" ) ;
			ejecucion.setTxtSolicita( ( comentarios == null ? "" : comentarios ) ) ;
			ejecucion.setFechaAlta( now ) ;
			ejecucion.setTxtHistorial( ( comentarios == null ? user.getTblUsuario( ).getNombre( ) + ": " : "<b>" + user.getTblUsuario( ).getNombre( ) + "</b>: " + comentarios ) ) ;
			
			em.persist( ejecucion ) ;
			em.flush( ) ;
			em.refresh( ejecucion ) ;
			
			tblTareaPreimplementacion.getTblEjecucionMaterials( ).add( ejecucion ) ;
			
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
			
			int index = 0 ;
			
			// guarda los archivos
			List< String > salvados = MCUtil.saveAllCampaignSendedFiles( archivos , cveCampania , ejecucion.getCveMaterial( ) ) ;
			
//			int cveCotizacion = cotizacion.getCveCotizacion( ) ;
			
			// coloca todos los comentarios de los servicios
			for( String s : salvados )
			{
				TblEjecucionMaterialArchivo ejecucionArchivo = new TblEjecucionMaterialArchivo( ) ;
				
				ejecucionArchivo.setArchivoEnviado( s ) ;
				ejecucionArchivo.setArchivoRespondido( "" ) ;
				ejecucionArchivo.setStatus( ( byte ) 1 ) ;
				ejecucionArchivo.setTblEjecucionMaterial( ejecucion ) ;
				
				em.persist( ejecucionArchivo ) ;
				em.flush( ) ;
				em.refresh( ejecucionArchivo ) ;
				
				ejecucion.getTblEjecucionMaterialArchivos( ).add( ejecucionArchivo ) ;
				
				em.persist( ejecucion ) ;
				em.flush( ) ;
				em.refresh( ejecucion ) ;
			}
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCampaignFlowSreen2Reject( UserLogin user , TblEjecucionMaterial ejecucion , FlowProcessForm forma , String comentarios , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// en caso de uqe ejecucion sea null
		if( ejecucion == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ExecutionNotExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_ERROR_EXECUTION_NOT_EXIST , 
					null ) ;
		
		// ping( 271 ) ;
		
		ejecucion = em.find( TblEjecucionMaterial.class , new Integer( ejecucion.getCveMaterial( ) ) ) ;
		
		// empieza transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			// cambia bandera
			ejecucion.setBandera( ( byte ) 4 ) ;
			ejecucion.setTxtAgencia( ( comentarios == null ? "" : comentarios ) ) ;
			ejecucion.setTxtHistorial( ( ejecucion.getTxtHistorial( ) == null ? "" : ejecucion.getTxtHistorial( ) ) + "<br/><br/>" + ( comentarios == null ? user.getTblUsuario( ).getNombre( ) + ": " : "<b>" + user.getTblUsuario( ).getNombre( ) + "</b>: " + comentarios ) ) ;
			
			em.merge( ejecucion ) ;
			em.flush( ) ;
//			em.refresh( ejecucion ) ;
			
			// toma los archivos
			List< TblEjecucionMaterialArchivo > archivos = ejecucion.getTblEjecucionMaterialArchivos( ) ;
			
			int cveCampania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ).getCveCampania( ) ;
			
			// recorre los archivos
			for( TblEjecucionMaterialArchivo archivo : archivos )
			{
				// toma el nombre
				String archivoNombre = archivo.getArchivoEnviado( ) ;
				
				// obtiene el indice
				int index = MCUtil.getFileNameIndex( archivoNombre ) ;
				
				// toma el archivo FormFile
				FormFile ff = null ;
				switch ( index )
				{
					case 1 :
						ff = forma.getArchivo01( ) ;
						break;
	
					case 2 :
						ff = forma.getArchivo02( ) ;
						break;
	
					case 3 :
						ff = forma.getArchivo03( ) ;
						break;
	
					case 4 :
						ff = forma.getArchivo04( ) ;
						break;
	
					case 5 :
						ff = forma.getArchivo05( ) ;
						break;
	
					case 6 :
						ff = forma.getArchivo06( ) ;
						break;
	
					case 7 :
						ff = forma.getArchivo07( ) ;
						break;
	
					case 8 :
						ff = forma.getArchivo08( ) ;
						break;
	
					case 9 :
						ff = forma.getArchivo09( ) ;
						break;
	
					case 10 :
						ff = forma.getArchivo010( ) ;
						break;
	
					case 11 :
						ff = forma.getArchivo011( ) ;
						break;
	
					case 12 :
						ff = forma.getArchivo012( ) ;
						break;
	
					case 13 :
						ff = forma.getArchivo013( ) ;
						break;
	
					case 14 :
						ff = forma.getArchivo014( ) ;
						break;
	
					case 15 :
						ff = forma.getArchivo015( ) ;
						break;
	
					case 16 :
						ff = forma.getArchivo016( ) ;
						break;
	
					case 17 :
						ff = forma.getArchivo017( ) ;
						break;
	
					case 18 :
						ff = forma.getArchivo018( ) ;
						break;
	
					case 19 :
						ff = forma.getArchivo019( ) ;
						break;
	
					case 20 :
						ff = forma.getArchivo020( ) ;
						break;
	
					case 21 :
						ff = forma.getArchivo021( ) ;
						break;
	
					case 22 :
						ff = forma.getArchivo022( ) ;
						break;
	
					case 23 :
						ff = forma.getArchivo023( ) ;
						break;
	
					case 24 :
						ff = forma.getArchivo024( ) ;
						break;
	
					case 25 :
						ff = forma.getArchivo025( ) ;
						break;
	
					case 26 :
						ff = forma.getArchivo026( ) ;
						break;
	
					case 27 :
						ff = forma.getArchivo027( ) ;
						break;
	
					case 28 :
						ff = forma.getArchivo028( ) ;
						break;
	
					case 29 :
						ff = forma.getArchivo029( ) ;
						break;
	
					case 30 :
						ff = forma.getArchivo030( ) ;
						break;
	
					default:
						break;
				}
				
				// en caso de que no sea null
				if( ff != null && ff.getFileName( ).trim( ).length( ) > 0 )
				{
					// guarda archivo y recoge el nombre
					String nombre = MCUtil.saveCampaignReturnedFiles( ff , cveCampania , ejecucion.getCveMaterial( ) ) ;
					
					// cambia el registro
					TblEjecucionMaterialArchivo archivoAux = em.find( TblEjecucionMaterialArchivo.class , new Integer( archivo.getCve( ) ) ) ;
					
					archivoAux.setArchivoRespondido( nombre ) ;
					
					em.merge( archivoAux ) ;
					em.flush( ) ;
//					em.refresh( archivoAux ) ;
				}
				
				// siguienteen el ciclo
			}// termina ciclo for
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			// realiza commit
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ErrorProcessingScreen2Rejected" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_ERROR_PROCESING_SCREEN_2_REJECT , 
					e ) ;
		}
		
		return result ;
		
//		// verifica los servicios
//		if( archivos == null || archivos.size( ) == 0 )
//			throw new MasterCardException( 
//					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ThereIsNoFiles" ) , 
//					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_NO_FILE_EXIST , 
//					null ) ;
//		
//		if( comentarios == null )
//			comentarios = "" ;
//		
//		// ya tiene los archivos
//		
//		EntityTransaction et = em.getTransaction( ) ;
//		try
//		{
//			et.begin( ) ;
//			
//			int cveCampania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ).getCveCampania( ) ;
//			
//			Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
//			
//			// crea registro en tabla tbl_preimplementacion_cotiza
//			TblEjecucionMaterial cotizacion = new TblEjecucionMaterial( ) ;
//			
//			cotizacion.setBandera( ( byte ) 2 ) ;
//			cotizacion.setFechaAlta( now ) ;
//			cotizacion.setStatus( ( byte ) 1 ) ;
//			cotizacion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
//			cotizacion.setTxtAgencia( "" ) ;
//			cotizacion.setTxtSolicita( ( comentarios == null ? "" : comentarios ) ) ;
//			cotizacion.setTxtHistorial( ( comentarios == null ? "" : user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
//			
//			em.persist( cotizacion ) ;
//			em.flush( ) ;
//			em.refresh( cotizacion ) ;
//			
//			tblTareaPreimplementacion.getTblPreimplementacionCotizas( ).add( cotizacion ) ;
//			
//			em.persist( tblTareaPreimplementacion ) ;
//			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
//			
//			int index = 0 ;
//			
//			// guarda los archivos
//			List< String > salvados = MCUtil.saveAllCampaignReturnedFiles( archivos , cveCampania ,  ) ;
//			
////			int cveCotizacion = cotizacion.getCveCotizacion( ) ;
//			
//			// coloca todos los comentarios de los servicios
//			for( String s : salvados )
//			{
//				TblTareaEjecucion tareaEjecucion = new TblTareaEjecucion( ) ;
//				
//				tareaEjecucion.setArchivoNombre( s ) ;
//				tareaEjecucion.setBandera( ( byte ) 2 ) ;
//				tareaEjecucion.setComentario( "" ) ;
//				tareaEjecucion.setFechaAlta( now ) ;
//				tareaEjecucion.setForma( ( byte ) 8 ) ;
//				tareaEjecucion.setStatus( ( byte ) 1 ) ;
//				tareaEjecucion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
//				tareaEjecucion.setTxtHistorial( "" ) ;
//				
//				em.persist( tareaEjecucion ) ;
//				em.flush( ) ;
//				em.refresh( tareaEjecucion ) ;
//				
//				tblTareaPreimplementacion.getTblTareaEjecucions( ).add( tareaEjecucion ) ;
//				
//				em.persist( tblTareaPreimplementacion ) ;
//				em.flush( ) ;
//				em.refresh( tblTareaPreimplementacion ) ;
//			}
//			
//			// siguiente tarea
//			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , nombreSalida, user.getCveUsuario( ) , et ) ;
//			
//			et.commit( ) ;
//		}catch( Exception e )
//		{
//			et.rollback( ) ;
//			throw new MasterCardException( 
//					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
//					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
//					e ) ;
//		}
	}
	
	public static int processCampaignFlowSreen3( UserLogin user , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida, String comentarios )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
                String texto = "" + comentarios ;
				
		// empieza transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
						
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , texto , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCampaignFlowSreen2Authorize( UserLogin user , TblEjecucionMaterial ejecucion , FlowProcessForm forma , String comentarios , TblTareaPreimplementacion tblTareaPreimplementacion , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// en caso de uqe ejecucion sea null
		if( ejecucion == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ExecutionNotExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_ERROR_EXECUTION_NOT_EXIST , 
					null ) ;
		
		// ping( 273 ) ;
		
		ejecucion = em.find( TblEjecucionMaterial.class , new Integer( ejecucion.getCveMaterial( ) ) ) ;
		
		// empieza transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			// cambia bandera
			ejecucion.setBandera( ( byte ) 3 ) ;
			ejecucion.setTxtAgencia( ( comentarios == null ? "" : comentarios ) ) ;
			ejecucion.setTxtHistorial( ( ejecucion.getTxtHistorial( ) == null ? "" : ejecucion.getTxtHistorial( ) ) + "<br/><br/>" + ( comentarios == null ? user.getTblUsuario( ).getNombre( ) + ": " : "<b>" + user.getTblUsuario( ).getNombre( ) + "</b>: " + comentarios ) ) ;
			
			em.merge( ejecucion ) ;
			em.flush( ) ;
//			em.refresh( ejecucion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			// realiza commit
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ErrorProcessingScreen2Rejected" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_CAMPAIGN_ERROR_PROCESING_SCREEN_2_REJECT , 
					e ) ;
		}
		
		return result ;
		
	}
	
	public static int processCotizaServicioFormTwo( UserLogin user , int cveTareaPreimplementacionAnterior , int cveTareaPreimplementacion , double[ ][ ] precios , double[ ][ ] preciosD , double total , String comentario , byte[ ] fileData , String fileName , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		// verifica los servicios
		if( precios == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoPricesExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_SERVICE_SELECTED , 
					null ) ;
		
		// en caso de que no vengan los datos
		if( fileData != null && fileData.length == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileDataExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_DATA_EXIST , 
					null ) ;
		
		// en caso de que no vengan el nombre
		if( fileName != null && fileName.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileNameExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		if( comentario == null )
			comentario = "" ;
		
		// ping( 274 ) ;
		
		TblTareaPreimplementacion tblTareaPreimplementacionAnterior = em.find( TblTareaPreimplementacion.class , new Integer( cveTareaPreimplementacionAnterior ) ) ;
                TblPreimplementacion pre = tblTareaPreimplementacionAnterior.getTblPreimplementacion( ) ;
		
		// toma los PreimplementacionCotiza
		List< TblPreimplementacionCotiza > cotizas = tblTareaPreimplementacionAnterior.getTblPreimplementacionCotizas( ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblPreimplementacionCotiza preimplementacionCotiza = null ;
		
		if( cotizas != null && cotizas.size( ) > 0 )
			preimplementacionCotiza = cotizas.get( 0 ) ;
		
		// en caso de null
		if( preimplementacionCotiza == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// en caso e que no este en null
		// toma los servicios a cotizar
		List< TblPreimplementacionCotizacionServicio > cotizaServicios = preimplementacionCotiza.getTblPreimplementacionCotizacionServicios( ) ;
		
		// en caso de null
		if( cotizaServicios == null )
			return -1 ;
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// recorre
			for( TblPreimplementacionCotizacionServicio cotizaServicio : cotizaServicios )
			{
				// precio colocado
				double price = 0.0 , priceD = 0.0 ;
				
				// toma el id del servicio
				int cveServicio = cotizaServicio.getId( ).getCveServicio( ) ;
				
				// busca el precio en los precios
				// recorre los precios de paquetes sencillos
				for( int i = 0 ; i < precios.length ; i++ )
				{
					// toma el id y lo convierte en int
					int idServicio = ( int ) precios[ i ][ 0 ] ;
					
					// compara
					// en caso de que coincida
					if( idServicio == cveServicio )
					{
						// guarda el precio
						price = precios[ i ][ 1 ] ;
						
						// quiebra ciclo
						break ;
					}
				}
                                
                                // busca el precio en los precios
				// recorre los precios de paquetes dobles
				for( int x = 0 ; x < preciosD.length ; x++ )
				{
					// toma el id y lo convierte en int
					int idServicioD = ( int ) preciosD[ x ][ 0 ] ;
					
					// compara
					// en caso de que coincida
					if( idServicioD == cveServicio )
					{
						// guarda el precio
						priceD = preciosD[ x ][ 1 ] ;
						
						// quiebra ciclo
						break ;
					}
				}
				
				// guarda el precio
				cotizaServicio.setPrecio( ( float ) price ) ;
                                cotizaServicio.setPrecioD( ( float ) priceD ) ;
				
				em.merge( cotizaServicio ) ;
				em.flush( ) ;
//				em.refresh( cotizaServicio ) ;
			}
			
			// modifica el preimplementacionCotiza
			preimplementacionCotiza.setTxtAgencia( comentario ) ;
			preimplementacionCotiza.setTotal( ( float ) total ) ;
			preimplementacionCotiza.setTxtHistorial( ( preimplementacionCotiza.getTxtHistorial( ) == null ? "" : preimplementacionCotiza.getTxtHistorial( ) ) + ( comentario == null || comentario.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentario ) ) ;
			preimplementacionCotiza.setBandera( ( byte ) 2 ) ;
                        preimplementacionCotiza.setTblPreimplementacion( pre );
			
			// actualiza
			em.persist( preimplementacionCotiza ) ;
			em.flush( ) ;
//			em.refresh( preimplementacionCotiza ) ;
			
			// guarda el archivo
			String finalName = MCUtil.savePreimplementacionCotizaFile( preimplementacionCotiza.getCveCotizacion( ) , fileName , fileData ) ;
			
			// en caso de null
			if( finalName == null )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorSavingFile1" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR_SAVING_FILE , 
						null ) ;
			}
			
			// actualiza preimplementacionCotiza
			preimplementacionCotiza.setArchivoCotizacion( finalName ) ;
			
			// actualiza
			em.merge( preimplementacionCotiza ) ;
			em.flush( ) ;
//			em.refresh( preimplementacionCotiza ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , cveTareaPreimplementacion , comentario , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormContrato( UserLogin user , int cveCotizacion , TblTareaPreimplementacion tblTareaPreimplementacion , byte[ ] fileData , String fileName , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// en caso de que no vengan los datos
		if( fileData != null && fileData.length == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileDataExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_DATA_EXIST , 
					null ) ;
		
		// en caso de que no vengan el nombre
		if( fileName != null && fileName.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileNameExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 275 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblPreimplementacionCotiza preimplementacionCotiza = em.find( TblPreimplementacionCotiza.class , new Integer( cveCotizacion ) ) ;
		
		// en caso de null
		if( preimplementacionCotiza == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// crea el registro
			TblTareaEjecucion ejecucion = new TblTareaEjecucion( ) ;
			
			// guarda el archivo
			String finalName = MCUtil.savePreimplementacionContratoFile( preimplementacionCotiza.getCveCotizacion( ) , fileName , fileData ) ;
			
			// en caso de null
			if( finalName == null )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorSavingFile1" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR_SAVING_FILE , 
						null ) ;
			}
			
			ejecucion.setArchivoNombre( finalName ) ;
			ejecucion.setBandera( ( byte ) 2 ) ;
			ejecucion.setComentario( comentarios ) ;
			ejecucion.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			ejecucion.setForma( ( byte ) 2 ) ;
			ejecucion.setStatus( ( byte ) 1 ) ;
			ejecucion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
			ejecucion.setTxtHistorial( ( preimplementacionCotiza.getTxtHistorial( ) == null ? "" : preimplementacionCotiza.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			
			// actualiza
			em.persist( ejecucion ) ;
			em.flush( ) ;
			em.refresh( ejecucion ) ;
			
			tblTareaPreimplementacion.getTblTareaEjecucions( ).add( ejecucion ) ;
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
//	public static int processCotizaServicioFormPO( UserLogin user , int cveCotizacion , TblTareaPreimplementacion tblTareaPreimplementacion , byte[ ] fileData, int numPo , String fileName , String comentarios , String nombreSalida )
        public static int processCotizaServicioFormPO( UserLogin user , int cveCotizacion , TblTareaPreimplementacion tblTareaPreimplementacion , int numPo , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 276 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblPreimplementacionCotiza preimplementacionCotiza = em.find( TblPreimplementacionCotiza.class , new Integer( cveCotizacion ) ) ;
		
		// en caso de null
		if( preimplementacionCotiza == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
                        
                        preimplementacionCotiza.setNumPO( numPo ) ;
                        
                        // actualiza
			em.merge( preimplementacionCotiza ) ;
			em.flush( ) ;
//			em.refresh( preimplementacionCotiza ) ;
			
			// crea el registro
			TblTareaEjecucion ejecucion = new TblTareaEjecucion( ) ;
			
			
			ejecucion.setArchivoNombre( "obsoleto" ) ;
			ejecucion.setBandera( ( byte ) 2 ) ;
			ejecucion.setComentario( comentarios ) ;
			ejecucion.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			ejecucion.setForma( ( byte ) 3 ) ;
			ejecucion.setStatus( ( byte ) 1 ) ;
			ejecucion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
			ejecucion.setTxtHistorial( ( preimplementacionCotiza.getTxtHistorial( ) == null ? "" : preimplementacionCotiza.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			
			// actualiza
			em.persist( ejecucion ) ;
			em.flush( ) ;
			em.refresh( ejecucion ) ;
			
			tblTareaPreimplementacion.getTblTareaEjecucions( ).add( ejecucion ) ;
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
                        
                        // lanza notificacion
			NotificationUtil.throwNotificationTypeFinalizeFlow( numPo , tblTareaPreimplementacion.getTblAsset( ) , user , et ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormPR( UserLogin user , int cveCotizacion , TblTareaPreimplementacion tblTareaPreimplementacion , byte[ ] fileData , String fileName , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// en caso de que no vengan los datos
		if( fileData != null && fileData.length == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileDataExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_DATA_EXIST , 
					null ) ;
		
		// en caso de que no vengan el nombre
		if( fileName != null && fileName.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileNameExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 277 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblPreimplementacionCotiza preimplementacionCotiza = em.find( TblPreimplementacionCotiza.class , new Integer( cveCotizacion ) ) ;
		
		// en caso de null
		if( preimplementacionCotiza == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// crea el registro
			TblTareaEjecucion ejecucion = new TblTareaEjecucion( ) ;
			
			// guarda el archivo
			String finalName = MCUtil.savePreimplementacionPRFile( preimplementacionCotiza.getCveCotizacion( ) , fileName , fileData ) ;
			
			// en caso de null
			if( finalName == null )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorSavingFile1" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR_SAVING_FILE , 
						null ) ;
			}
			
			ejecucion.setArchivoNombre( finalName ) ;
			ejecucion.setBandera( ( byte ) 2 ) ;
			ejecucion.setComentario( comentarios ) ;
			ejecucion.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			ejecucion.setForma( ( byte ) 1 ) ;
			ejecucion.setStatus( ( byte ) 1 ) ;
			ejecucion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
			ejecucion.setTxtHistorial( ( preimplementacionCotiza.getTxtHistorial( ) == null ? "" : preimplementacionCotiza.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			
			// actualiza
			em.persist( ejecucion ) ;
			em.flush( ) ;
			em.refresh( ejecucion ) ;
			
			tblTareaPreimplementacion.getTblTareaEjecucions( ).add( ejecucion ) ;
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormAutorizaPrimerFactura( UserLogin user , int cveTareaPreimplementacionAnterior , TblTareaPreimplementacion tblTareaPreimplementacion , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 278 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblTareaPreimplementacion tblTareaPreimplementacionAnterior = em.find( TblTareaPreimplementacion.class , new Integer( cveTareaPreimplementacionAnterior ) ) ;
		
		// en caso de null
		if( tblTareaPreimplementacionAnterior == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoTareaAnteriorExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// busca la tareaEjecucion
		List< TblTareaEjecucion > tareaEjecuciones = tblTareaPreimplementacionAnterior.getTblTareaEjecucions( ) ;
		
		TblTareaEjecucion tareaEjecucion = null ;
		
		// en caso de que sea null o 0
		if( tareaEjecuciones == null || tareaEjecuciones.size( ) == 0 )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFacturaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		}
		// en caso de qu si tenga
		else
		{
			// recorre
			for( TblTareaEjecucion ej : tareaEjecuciones )
				// el primero en estatus 1
				if( ej.getStatus( ) == 1 )
				{
					tareaEjecucion = ej ;
					
					break ;
				}
			
			if( tareaEjecucion == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFacturaExist" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
						null ) ;
		}
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// cambia el estado de la tareaEjecucion a rechazado
			tareaEjecucion.setBandera( ( byte ) 3 ) ;
//			tareaEjecucion.setTxtHistorial( tareaEjecucion.getTxtHistorial( ) + "<br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ;
			tareaEjecucion.setTxtHistorial( ( tareaEjecucion.getTxtHistorial( ) == null ? "" : tareaEjecucion.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			tareaEjecucion.setComentario( comentarios ) ;
			
			// actualiza
			em.merge( tareaEjecucion ) ;
			em.flush( ) ;
//			em.refresh( tareaEjecucion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormRechazarPrimerFactura( UserLogin user , int cveTareaPreimplementacionAnterior , TblTareaPreimplementacion tblTareaPreimplementacion , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 279 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblTareaPreimplementacion tblTareaPreimplementacionAnterior = em.find( TblTareaPreimplementacion.class , new Integer( cveTareaPreimplementacionAnterior ) ) ;
		
		// en caso de null
		if( tblTareaPreimplementacionAnterior == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoTareaAnteriorExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// busca la tareaEjecucion
		List< TblTareaEjecucion > tareaEjecuciones = tblTareaPreimplementacionAnterior.getTblTareaEjecucions( ) ;
		
		TblTareaEjecucion tareaEjecucion = null ;
		
		// en caso de que sea null o 0
		if( tareaEjecuciones == null || tareaEjecuciones.size( ) == 0 )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFacturaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		}
		// en caso de qu si tenga
		else
		{
			// recorre
			for( TblTareaEjecucion ej : tareaEjecuciones )
				// el primero en estatus 1
				if( ej.getStatus( ) == 1 )
				{
					tareaEjecucion = ej ;
					
					break ;
				}
			
			if( tareaEjecucion == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFacturaExist" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
						null ) ;
		}
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// cambia el estado de la tareaEjecucion a rechazado
			tareaEjecucion.setBandera( ( byte ) 4 ) ;
			tareaEjecucion.setTxtHistorial( ( tareaEjecucion.getTxtHistorial( ) == null ? "" : tareaEjecucion.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
//			tareaEjecucion.setTxtHistorial( ( tareaEjecucion.getTxtHistorial( ) == null ? "" : tareaEjecucion.getTxtHistorial( ) ) + "<br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ;
			tareaEjecucion.setComentario( comentarios ) ;
			
			// actualiza
			em.merge( tareaEjecucion ) ;
			em.flush( ) ;
//			em.refresh( tareaEjecucion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormAutorizaAgenda( UserLogin user , int cveTareaPreimplementacionAnterior , TblTareaPreimplementacion tblTareaPreimplementacion , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 280 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblTareaPreimplementacion tblTareaPreimplementacionAnterior = em.find( TblTareaPreimplementacion.class , new Integer( cveTareaPreimplementacionAnterior ) ) ;
		
		// en caso de null
		if( tblTareaPreimplementacionAnterior == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoTareaAnteriorExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// busca la tareaEjecucion
		List< TblTareaEjecucion > tareaEjecuciones = tblTareaPreimplementacionAnterior.getTblTareaEjecucions( ) ;
		
		TblTareaEjecucion tareaEjecucion = null ;
		
		// en caso de que sea null o 0
		if( tareaEjecuciones == null || tareaEjecuciones.size( ) == 0 )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFacturaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		}
		// en caso de qu si tenga
		else
		{
			// recorre
			for( TblTareaEjecucion ej : tareaEjecuciones )
				// el primero en estatus 1
				if( ej.getStatus( ) == 1 )
				{
					tareaEjecucion = ej ;
					
					break ;
				}
			
			if( tareaEjecucion == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFacturaExist" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
						null ) ;
		}
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// cambia el estado de la tareaEjecucion a rechazado
			tareaEjecucion.setBandera( ( byte ) 3 ) ;
//			tareaEjecucion.setTxtHistorial( ( tareaEjecucion.getTxtHistorial( ) == null ? "" : tareaEjecucion.getTxtHistorial( ) ) + "<br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ;
			tareaEjecucion.setTxtHistorial( ( tareaEjecucion.getTxtHistorial( ) == null ? "" : tareaEjecucion.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			tareaEjecucion.setComentario( comentarios ) ;
			
			// actualiza
			em.merge( tareaEjecucion ) ;
			em.flush( ) ;
//			em.refresh( tareaEjecucion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormRechazarAgenda( UserLogin user , int cveTareaPreimplementacionAnterior , TblTareaPreimplementacion tblTareaPreimplementacion , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 281 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblTareaPreimplementacion tblTareaPreimplementacionAnterior = em.find( TblTareaPreimplementacion.class , new Integer( cveTareaPreimplementacionAnterior ) ) ;
		
		// en caso de null
		if( tblTareaPreimplementacionAnterior == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoTareaAnteriorExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// busca la tareaEjecucion
		List< TblTareaEjecucion > tareaEjecuciones = tblTareaPreimplementacionAnterior.getTblTareaEjecucions( ) ;
		
		TblTareaEjecucion tareaEjecucion = null ;
		
		// en caso de que sea null o 0
		if( tareaEjecuciones == null || tareaEjecuciones.size( ) == 0 )
		{
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFacturaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		}
		// en caso de qu si tenga
		else
		{
			// recorre
			for( TblTareaEjecucion ej : tareaEjecuciones )
				// el primero en estatus 1
				if( ej.getStatus( ) == 1 )
				{
					tareaEjecucion = ej ;
					
					break ;
				}
			
			if( tareaEjecucion == null )
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFacturaExist" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
						null ) ;
		}
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// cambia el estado de la tareaEjecucion a rechazado
			tareaEjecucion.setBandera( ( byte ) 4 ) ;
//			tareaEjecucion.setTxtHistorial( ( tareaEjecucion.getTxtHistorial( ) == null ? "" : tareaEjecucion.getTxtHistorial( ) ) + "<br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ;
			tareaEjecucion.setTxtHistorial( ( tareaEjecucion.getTxtHistorial( ) == null ? "" : tareaEjecucion.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			tareaEjecucion.setComentario( comentarios ) ;
			
			// actualiza
			em.merge( tareaEjecucion ) ;
			em.flush( ) ;
//			em.refresh( tareaEjecucion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormPrimerFactura( UserLogin user , int cveCotizacion , TblTareaPreimplementacion tblTareaPreimplementacion , byte[ ] fileData , String fileName , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// en caso de que no vengan los datos
		if( fileData != null && fileData.length == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileDataExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_DATA_EXIST , 
					null ) ;
		
		// en caso de que no vengan el nombre
		if( fileName != null && fileName.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileNameExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 282 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblPreimplementacionCotiza preimplementacionCotiza = em.find( TblPreimplementacionCotiza.class , new Integer( cveCotizacion ) ) ;
		
		// en caso de null
		if( preimplementacionCotiza == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// crea el registro
			TblTareaEjecucion ejecucion = new TblTareaEjecucion( ) ;
			
			// guarda el archivo
			String finalName = MCUtil.savePreimplementacionPrimerFacturaFile( preimplementacionCotiza.getCveCotizacion( ) , fileName , fileData ) ;
			
			// en caso de null
			if( finalName == null )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorSavingFile1" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR_SAVING_FILE , 
						null ) ;
			}
			
			ejecucion.setArchivoNombre( finalName ) ;
			ejecucion.setBandera( ( byte ) 2 ) ;
			ejecucion.setComentario( comentarios ) ;
			ejecucion.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			ejecucion.setForma( ( byte ) 1 ) ;
			ejecucion.setStatus( ( byte ) 1 ) ;
			ejecucion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
//			ejecucion.setTxtHistorial( comentarios ) ;
			ejecucion.setTxtHistorial( ( ejecucion.getTxtHistorial( ) == null ? "" : ejecucion.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			
			// actualiza
			em.persist( ejecucion ) ;
			em.flush( ) ;
			em.refresh( ejecucion ) ;
			
			tblTareaPreimplementacion.getTblTareaEjecucions( ).add( ejecucion ) ;
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormEmitirBoletos( UserLogin user , int cveCotizacion , TblTareaPreimplementacion tblTareaPreimplementacion , byte[ ] fileData , String fileName , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// en caso de que no vengan los datos
		if( fileData != null && fileData.length == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileDataExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_DATA_EXIST , 
					null ) ;
		
		// en caso de que no vengan el nombre
		if( fileName != null && fileName.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileNameExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 283 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblPreimplementacionCotiza preimplementacionCotiza = em.find( TblPreimplementacionCotiza.class , new Integer( cveCotizacion ) ) ;
		
		// en caso de null
		if( preimplementacionCotiza == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// crea el registro
			TblTareaEjecucion ejecucion = new TblTareaEjecucion( ) ;
			
			// guarda el archivo
			String finalName = MCUtil.savePreimplementacionPrimerFacturaFile( preimplementacionCotiza.getCveCotizacion( ) , fileName , fileData ) ;
			
			// en caso de null
			if( finalName == null )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorSavingFile1" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR_SAVING_FILE , 
						null ) ;
			}
			
			ejecucion.setArchivoNombre( finalName ) ;
			ejecucion.setBandera( ( byte ) 2 ) ;
			ejecucion.setComentario( comentarios ) ;
			ejecucion.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			ejecucion.setForma( ( byte ) 1 ) ;
			ejecucion.setStatus( ( byte ) 1 ) ;
			ejecucion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
//			ejecucion.setTxtHistorial( comentarios ) ;
			ejecucion.setTxtHistorial( ( ejecucion.getTxtHistorial( ) == null ? "" : ejecucion.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			
			// actualiza
			em.persist( ejecucion ) ;
			em.flush( ) ;
			em.refresh( ejecucion ) ;
			
			tblTareaPreimplementacion.getTblTareaEjecucions( ).add( ejecucion ) ;
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormEntregaAgenda( UserLogin user , int cveCotizacion , TblTareaPreimplementacion tblTareaPreimplementacion , byte[ ] fileData , String fileName , String comentarios , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// en caso de que no vengan los datos
		if( fileData != null && fileData.length == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileDataExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_DATA_EXIST , 
					null ) ;
		
		// en caso de que no vengan el nombre
		if( fileName != null && fileName.trim( ).length( ) == 0 )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFileNameExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		if( comentarios == null )
			comentarios = "" ;
		
		// ping( 284 ) ;
		
		// toma el primer registro
		// en caso de que sea mayor a 1
		TblPreimplementacionCotiza preimplementacionCotiza = em.find( TblPreimplementacionCotiza.class , new Integer( cveCotizacion ) ) ;
		
		// en caso de null
		if( preimplementacionCotiza == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizaExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_FILE_NAME_EXIST , 
					null ) ;
		
		// empieza la transaccion
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// crea el registro
			TblTareaEjecucion ejecucion = new TblTareaEjecucion( ) ;
			
			// guarda el archivo
			String finalName = MCUtil.savePreimplementacionAgendaFile( preimplementacionCotiza.getCveCotizacion( ) , fileName , fileData ) ;
			
			// en caso de null
			if( finalName == null )
			{
				et.rollback( ) ;
				throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorSavingFile1" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR_SAVING_FILE , 
						null ) ;
			}
			
			ejecucion.setArchivoNombre( finalName ) ;
			ejecucion.setBandera( ( byte ) 2 ) ;
			ejecucion.setComentario( comentarios ) ;
			ejecucion.setFechaAlta( new Timestamp( System.currentTimeMillis( ) ) ) ;
			ejecucion.setForma( ( byte ) 1 ) ;
			ejecucion.setStatus( ( byte ) 1 ) ;
			ejecucion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
//			ejecucion.setTxtHistorial( comentarios ) ;
			ejecucion.setTxtHistorial( ( ejecucion.getTxtHistorial( ) == null ? "" : ejecucion.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			
			// actualiza
			em.persist( ejecucion ) ;
			em.flush( ) ;
			em.refresh( ejecucion ) ;
			
			tblTareaPreimplementacion.getTblTareaEjecucions( ).add( ejecucion ) ;
			em.merge( tblTareaPreimplementacion ) ;
			em.flush( ) ;
//			em.refresh( tblTareaPreimplementacion ) ;
			
			preimplementacionCotiza.setTxtHistorial( ( preimplementacionCotiza.getTxtHistorial( ) == null ? "" : preimplementacionCotiza.getTxtHistorial( ) ) + ( comentarios == null || comentarios.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentarios ) ) ;
			em.merge( preimplementacionCotiza ) ;
			em.flush( ) ;
//			em.refresh( preimplementacionCotiza ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , tblTareaPreimplementacion.getCveTareaPreimplementacion( ) , comentarios , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	
	public static int processCotizaServicioFormThreeRechazar( UserLogin user , int cveCotizacion , int[ ] servicios , String[ ] comentarios , String comentario , int cveTareaPreimplementacion , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// ping( 285 ) ;
		
		// toma la cotizacion
                TblPreimplementacionCotiza cotizacion = new TblPreimplementacionCotiza( ) ;
                // en caso de que exista
		TblTareaPreimplementacion tblTareaPreimplementacion = new TblTareaPreimplementacion( ) ;
                if( cveCotizacion > 0 )
                {
                    cotizacion = em.find( TblPreimplementacionCotiza.class , new Integer( cveCotizacion ) ) ;
                    tblTareaPreimplementacion = cotizacion.getTblTareaPreimplementacion( ) ;
                }else{
                    tblTareaPreimplementacion = em.find( TblTareaPreimplementacion.class , new Integer( cveTareaPreimplementacion ) ) ;
                    
                    EntityTransaction etA = em.getTransaction( ) ;
                     etA.begin( ) ;
                    Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
                            cotizacion.setBandera( ( byte ) 1 ) ;
                            cotizacion.setFechaAlta( now ) ;
                            cotizacion.setStatus( ( byte ) 1 ) ;
                            cotizacion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
                            cotizacion.setTotal( 0.0F ) ;
                            cotizacion.setTxtAgencia( "" ) ;
                            cotizacion.setTxtSolicita( ( comentario == null ? "" : comentario ) ) ;
                            cotizacion.setArchivoCotizacion( "" ) ;
                            cotizacion.setTxtHistorial( ( comentario == null ? user.getTblUsuario( ).getNombre( ) + ": " : user.getTblUsuario( ).getNombre( ) + ": " + comentario ) ) ;

                            em.persist( cotizacion ) ;
                            em.flush( ) ;
                            em.refresh( cotizacion ) ;

                            tblTareaPreimplementacion.getTblPreimplementacionCotizas( ).add( cotizacion ) ;

                            em.persist( tblTareaPreimplementacion ) ;
                            em.flush( ) ;
                            em.refresh( tblTareaPreimplementacion ) ;
                            etA.commit( ) ;
                }
		
		
		// en caso de uqe sea null
		if( cotizacion == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizacionExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_COTIZACION_EXIST , 
					null ) ;
				
		// verifica los servicios
		if( servicios == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoServicesSelected" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_SERVICE_SELECTED , 
					null ) ;
		
		// en caso de que no vengan la misma cantidad de comentarios
		if( comentarios != null && servicios.length != comentarios.length )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ServicesLengthNotEqualComents" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_SERVICES_NOT_EQUAL_COMENTS , 
					null ) ;
		
		if( comentarios == null )
		{
			comentarios = new String[ servicios.length ] ;
			
			for( int i = 0 ; i < comentarios.length ; i++ )
				comentarios[ i ] = "" ;
		}
		
		// toma los servicios
		TblServicio[ ] services = new TblServicio[ servicios.length ] ;
		
		int index = 0 ;
		
		List< TblPreimplementacionCotizacionServicio > nuevosServicios = new ArrayList< TblPreimplementacionCotizacionServicio >( ) ;
		List< TblPreimplementacionCotizacionServicio > actualesServicios = cotizacion.getTblPreimplementacionCotizacionServicios( ) ;
		List< TblPreimplementacionCotizacionServicio > modificadosServicios = new ArrayList< TblPreimplementacionCotizacionServicio >( ) ;
		List< TblPreimplementacionCotizacionServicio > quitadosServicios = new ArrayList< TblPreimplementacionCotizacionServicio >( ) ;
		
		// recorre los servicios nuevos para obtener las modificaciones de los que ya existen y los servicios nuevos
		for( int cveServicio : servicios )
		{
			// verifica si existe en la cotizacion actual
			TblPreimplementacionCotizacionServicio servicioActual = null ;
			
                        if( actualesServicios != null  )
                        {
                            // recorre
                            for( TblPreimplementacionCotizacionServicio servActual : actualesServicios )
                            {
                                    // toma el servicio
                                    TblServicio serv = servActual.getTblServicio( ) ;

                                    // en caso de no null y mismo cve
                                    if( serv != null && serv.getCveServicio( ) == cveServicio )
                                    {
                                            // asigna
                                            servicioActual = servActual ;

                                            // quiebra
                                            break ;
                                    }
                            }// termina el for
                        }
			
			
			// en caso d eque no venga null
			if( servicioActual != null )
			{
				// si existe por tanto conserva resultado pero cambia comentari
				servicioActual.setComentarios( comentarios[ index ] ) ;
				
				// el precio no cambia
				
				// agrega a modificados
				modificadosServicios.add( servicioActual ) ;
			}
			// en caso de que venga null
			else
			{
				// crea nuevo servicio
				TblPreimplementacionCotizacionServicio cotizaServicio = new TblPreimplementacionCotizacionServicio( ) ;
				
				TblServicio servicio = em.find( TblServicio.class , new Integer( cveServicio ) ) ;
				
				// llave
				TblPreimplementacionCotizacionServicioPK pk = new TblPreimplementacionCotizacionServicioPK( ) ;
				pk.setCveCotizacion( cotizacion.getCveCotizacion( ) ) ;
				pk.setCveServicio( servicio.getCveServicio( ) ) ;
				
				String coment = comentarios[ index ] ;
				
				if( coment == null )
					coment = "" ;
				
				// coloca llave
				cotizaServicio.setId( pk ) ;
				cotizaServicio.setComentarios( coment ) ;
				cotizaServicio.setStatus( ( byte ) 1 ) ;
				cotizaServicio.setTblPreimplementacionCotiza( cotizacion ) ;
				cotizaServicio.setTblServicio( servicio ) ;
				cotizaServicio.setPrecio( 0.0F ) ;
				
				// agrega a nuevos
				nuevosServicios.add( cotizaServicio ) ;
				
			}
			
			// incrementa index
			index++ ;
		}// acaba el for para recorrer servicios
		
		// recorre los ya existentes para obtener los quitadosServicios
                if( actualesServicios != null )
                {
                    for( TblPreimplementacionCotizacionServicio cotSer : actualesServicios )
                    {
                            boolean existe = false ;

                            // revisa en servicios si existe
                            for( int cveServicio : servicios )
                            {
                                    // toma el servicio
                                    TblServicio serv = cotSer.getTblServicio( ) ;

                                    // en caso de que coincida el servicio
                                    if( serv != null && serv.getCveServicio( ) == cveServicio )
                                    {
                                            // indica que si existe y quiebra
                                            existe = true ;
                                            break ;
                                    }
                            }// termina ciclo para recorrer servicios

                            // en caso d eque no exista
                            if( ! existe )
                                    // lo agrega a los quitados
                                    quitadosServicios.add( cotSer ) ;

                    }// termina ciclo para recorrer actualesServicios
                }
		
		
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
                        
                        if( cveCotizacion == 0 )
                        {                            
                            Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
			
                            cotizacion.setBandera( ( byte ) 1 ) ;
                            cotizacion.setFechaAlta( now ) ;
                            cotizacion.setStatus( ( byte ) 1 ) ;
                            cotizacion.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
                            cotizacion.setTotal( 0.0F ) ;
                            cotizacion.setTxtAgencia( "" ) ;
                            cotizacion.setTxtSolicita( ( comentario == null ? "" : comentario ) ) ;
                            cotizacion.setArchivoCotizacion( "" ) ;
                            cotizacion.setTxtHistorial( ( comentario == null ? user.getTblUsuario( ).getNombre( ) + ": " : user.getTblUsuario( ).getNombre( ) + ": " + comentario ) ) ;

                            em.persist( cotizacion ) ;
                            em.flush( ) ;
                            em.refresh( cotizacion ) ;

                            tblTareaPreimplementacion.getTblPreimplementacionCotizas( ).add( cotizacion ) ;

                            em.persist( tblTareaPreimplementacion ) ;
                            em.flush( ) ;
                            em.refresh( tblTareaPreimplementacion ) ;
                        }
			
			// elimina los quitados
			for( TblPreimplementacionCotizacionServicio cotServ : quitadosServicios )
			{
				// lo quita de cotizacion actual
				cotizacion.getTblPreimplementacionCotizacionServicios( ).remove( cotServ ) ;
				em.persist( cotizacion ) ;
				em.flush( ) ;
				em.refresh( cotizacion ) ;
				
				// lo quita del servicio
				TblServicio serv = cotServ.getTblServicio( ) ;
				serv.getTblPreimplementacionCotizacionServicios( ).remove( cotServ ) ;
				em.merge( serv ) ;
				em.flush( ) ;
//				em.refresh( serv ) ;
				
				// elimina de base
				em.remove( cotServ ) ;
				em.flush( ) ;
			}
			
			// modifica los modificados
			for( TblPreimplementacionCotizacionServicio cotServ : modificadosServicios )
			{
				em.merge( cotServ ) ;
				em.flush( ) ;
//				em.refresh( cotServ ) ;
			}
			
			// agrega los nuevos
			for( TblPreimplementacionCotizacionServicio cotServ : nuevosServicios )
			{
				
				em.merge( cotServ ) ;
				em.flush( ) ;
//				em.refresh( cotServ ) ;
				
				cotizacion.getTblPreimplementacionCotizacionServicios( ).add( cotServ ) ;
				
				em.persist( cotizacion ) ;
				em.flush( ) ;
				em.refresh( cotizacion ) ;
				
				TblServicio servicio = cotServ.getTblServicio( ) ;
				
				servicio.getTblPreimplementacionCotizacionServicios( ).add( cotServ ) ;
				
				em.merge( servicio ) ;
				em.flush( ) ;
//				em.refresh( servicio ) ;
			}
			
			// modifica la cotizacion
			cotizacion.setTotal( 0.0F ) ;
			cotizacion.setTxtSolicita( ( comentario == null || comentario.trim( ).length( ) == 0 ? "" : comentario ) ) ;
//			cotizacion.setTxtHistorial( ( cotizacion.getTxtHistorial( )  == null ? "" : cotizacion.getTxtHistorial( ) )+ ( comentario == null || comentario.trim( ).length( ) == 0 ? "" : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentario ) ) ;
			cotizacion.setTxtHistorial( ( cotizacion.getTxtHistorial( )  == null ? "" : cotizacion.getTxtHistorial( ) )+ ( comentario == null || comentario.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentario ) ) ;
			cotizacion.setBandera( ( byte ) 3 ) ;
			
			em.persist( cotizacion ) ;
			em.flush( ) ;
			em.refresh( cotizacion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , cveTareaPreimplementacion , comentario , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
	
	public static int processCotizaServicioFormThreeAutorizar( UserLogin user , int cveCotizacion , String comentario , int cveTareaPreimplementacion , String nombreSalida )
		throws
			MasterCardException
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		int result = -1 ;
		
		// ping( 286 ) ;
		
		// toma la cotizacion
		TblPreimplementacionCotiza cotizacion = em.find( TblPreimplementacionCotiza.class , new Integer( cveCotizacion ) ) ;
		
		// en caso de uqe sea null
		if( cotizacion == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoCotizacionExist" ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_NO_COTIZACION_EXIST , 
					null ) ;
		
		// en caso de que exista
		TblTareaPreimplementacion tblTareaPreimplementacion = cotizacion.getTblTareaPreimplementacion( ) ;
		
		EntityTransaction et = em.getTransaction( ) ;
		try
		{
			et.begin( ) ;
			
			// modifica la cotizacion
			cotizacion.setTxtSolicita( ( comentario == null || comentario.trim( ).length( ) == 0 ? "" : comentario ) ) ;
//			cotizacion.setTxtHistorial( ( cotizacion.getTxtHistorial( )  == null ? "" : cotizacion.getTxtHistorial( ) )+ ( comentario == null || comentario.trim( ).length( ) == 0 ? "" : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentario ) ) ;
			cotizacion.setTxtHistorial( ( cotizacion.getTxtHistorial( )  == null ? "" : cotizacion.getTxtHistorial( ) )+ ( comentario == null || comentario.trim( ).length( ) == 0 ? "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " : "<br/><br/>" + user.getTblUsuario( ).getNombre( ) + ": " + comentario ) ) ;
			// Cotizacion=aceptada
			cotizacion.setBandera( ( byte ) 4 ) ;
			
			em.merge( cotizacion ) ;
			em.flush( ) ;
//			em.refresh( cotizacion ) ;
			
			// siguiente tarea
			result = stepUpWorkFlow( user , cveTareaPreimplementacion , comentario , nombreSalida, user.getCveUsuario( ) , et ) ;
			
			et.commit( ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			et.rollback( ) ;
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.Error" , e.getMessage( ) ) , 
					MCUtil.MASTERCARD_ERROR_CODE_FLOWS_PROCESS_PREIMPLEMENTATION_ERROR , 
					e ) ;
		}
		
		return result ;
	}
        
        public static boolean changeLanguaje( int cve )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
            EntityTransaction et = em.getTransaction( ) ;
            et.begin( ) ;
            
            TblUsuario us = em.find( TblUsuario.class , new Integer( cve ) ) ;
            
            int actual = us.getIdioma( ) ;
            
            if( actual == 0 ){
                us.setIdioma( ( byte ) 1 ) ;
            } else {
                us.setIdioma( ( byte ) 0 ) ;
            }            
            
            em.merge( us ) ;
            em.flush( ) ;
//            em.refresh( us ) ;
            et.commit( ) ;
            
            return true ;
            
        }
        
        public static List< utilReporteDos > datosReporteDos( String sql )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                        
            List< utilReporteDos > res = new ArrayList< utilReporteDos >( ) ;
            EntityTransaction et = em.getTransaction( ) ;
            et.begin( ) ;
            try {
                
                System.out.println( sql ) ;

              Query query = em.createNativeQuery( sql ) ;  
            List results = query.getResultList( ) ;
            
            
            for( int i = 0 ; i < results.size( ) ; i ++ ){
                
                utilReporteDos r = new utilReporteDos( ) ;
                
                SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss" ) ;
                String cadena = results.get(i).toString( ),
                        pais = "" ,
                        cuenta = "" ,
                        tipoCuenta = "" ;                
                
                cadena = cadena.replace("[", "") ;
                cadena = cadena.replace("]", "") ;
                String[] sp = cadena.split(",") ;
                java.util.Date fIni = sdf.parse( sp[ 3 ] ) ;
                java.util.Date fFin = sdf.parse( sp[ 4 ] ) ;
                double d = Double.parseDouble( sp[ 5 ].trim( ) ) ;
                
                pais = sp[ 0 ] ;
                cuenta = sp[ 1 ] ;
                tipoCuenta = sp[ 2 ] ;
                Timestamp ini = new  Timestamp( fIni.getTime( ) ) ;
                Timestamp fin = new  Timestamp( fFin.getTime( ) ) ;
                BigDecimal tot = new BigDecimal( d ) ;
                        
               r.setPais( pais ) ;
               r.setCuenta( cuenta ) ;
               r.setTipoCuenta( tipoCuenta ) ;
               r.setIni( ini ) ;
               r.setFin( fin ) ;
               r.setTotal( tot ) ;
               
               res.add( r ) ;
            }
            

            et.commit( ) ;
            closeEntityManager( ) ;
            return res ;
                
            }catch ( Exception e ) {
                e.printStackTrace( ) ;
                closeEntityManager( ) ;
            }            
            closeEntityManager( ) ;
            return null ;
        }
        
	public static List< datosReporteTres > datosParaReporteTres( String sql )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                                    
            List< datosReporteTres > res = new ArrayList< datosReporteTres >( ) ;
            EntityTransaction et = em.getTransaction( ) ;
            et.begin( ) ;
            
            try{
                System.out.println( sql ) ;
                
                Query query = em.createNativeQuery( sql ) ;  
                List results = query.getResultList( ) ;
            
            
                for( int i = 0 ; i < results.size( ) ; i ++ ){

                    datosReporteTres r = new datosReporteTres( ) ;

                    SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss" ) ;
                    String cadena = results.get(i).toString( ),
                            pais = "" ,
                            cuenta = "" ,
                            campaign = "",
                            asset = "" ;
                    
                    int bandera = 0,
                        bc = 0,
                        paquetes = 0 ;

                    cadena = cadena.replace("[", "") ;
                    cadena = cadena.replace("]", "") ;
                    System.out.println( cadena ) ;
                    String[] sp = cadena.split(",") ;
                    java.util.Date fIni = sdf.parse( sp[ 7 ] ) ;
                    java.util.Date fFin = sdf.parse( sp[ 8 ] ) ;
                    
                    bandera = Integer.parseInt( sp[ 0 ].trim( ) ) ;
                    pais = sp[ 1 ] ;
                    cuenta = sp[ 2 ] ;
                    bc = Integer.parseInt( sp[ 3 ].trim( ) ) ;
                    campaign = sp[ 4 ] ;
                    paquetes = Integer.parseInt( sp[ 5 ].trim( ) ) ;
                    asset = sp[ 6 ] ;
                    Timestamp ini = new  Timestamp( fIni.getTime( ) ) ;
                    Timestamp fin = new  Timestamp( fFin.getTime( ) ) ;

                   r.setStatus( bandera ) ;
                   r.setPais( pais ) ;
                   r.setCuenta( cuenta ) ;
                   r.setBc( bc ) ;
                   r.setCampania( campaign ) ;
                   r.setPaquetes( paquetes ) ;
                   r.setAsset( asset ) ;
                   r.setIni( ini ) ;
                   r.setFin( fin ) ;

                   res.add( r ) ;
                   
                }
            

            et.commit( ) ;
            closeEntityManager( ) ;
            return res ;
                
            }catch ( Exception e ) {
                e.printStackTrace( ) ;
                closeEntityManager( ) ;
            }            
            closeEntityManager( ) ;
            return null ;
        }
        
        public static List< datosReporteCuatro > datosParaReporteCuatro( String sql )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                                    
            List< datosReporteCuatro > res = new ArrayList< datosReporteCuatro >( ) ;
            EntityTransaction et = em.getTransaction( ) ;
            et.begin( ) ;
            
            try{
                System.out.println( sql ) ;
                
                Query query = em.createNativeQuery( sql ) ;
                List results = query.getResultList( ) ;
            
                for( int i = 0 ; i < results.size( ) ; i ++ ){
                    
                    datosReporteCuatro r = new datosReporteCuatro( ) ;

                    SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" ) ;
                    String cadena = results.get(i).toString( ) ;
                    
                    cadena = cadena.replace("[", "") ;
                    cadena = cadena.replace("]", "") ;
                    System.out.println( cadena ) ;
                    String[] sp = cadena.split(",") ;
                    
                    java.util.Date fIni = sdf.parse( sp[ 5 ] ) ;
                    java.util.Date fFin = sdf.parse( sp[ 6 ] ) ;
                    String in = sdf.format( fIni ), fi = sdf.format( fFin ) ;
                    
                    r.setPais( sp[ 0 ].trim( ) ) ;
                    r.setBc( Integer.parseInt( sp[ 1 ].trim( ) ) ) ;
                    r.setCuenta( sp[ 2 ].trim( ) ) ;
                    r.setCampania( sp[ 3 ].trim( ) ) ;
                    r.setAsset(sp[ 4 ].trim( ) ) ;
                    r.setIni( in ) ;
                    r.setFin( fi ) ;
                    r.setPaquetes( Integer.parseInt( sp[ 7 ].trim( ) ) ) ;
                    r.setCveAsset( Integer.parseInt( sp[ 8 ].trim( ) ) ) ;
                    r.setPrecio( 0 ) ;

                    res.add( r ) ;                   
                }            

            et.commit( ) ;
            closeEntityManager( ) ;
            return res ;
                
            }catch ( Exception e ) {
                e.printStackTrace( ) ;
                closeEntityManager( ) ;
            }            
            closeEntityManager( ) ;
            return null ;
        }
        
        public static List< utilReporteUno > datosParaReporteUno( String sql )
        {
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
                                    
            List< utilReporteUno > res = new ArrayList< utilReporteUno >( ) ;
            
            EntityTransaction et = em.getTransaction( ) ;
            et.begin( ) ;
            
            try{
                System.out.println( sql ) ;
                
                Query query = em.createNativeQuery( sql ) ;
                List results = query.getResultList( ) ;
                                
            
                for( int i = 0 ; i < results.size( ) ; i ++ ){
                    
                    utilReporteUno r = new utilReporteUno( ) ;

                    SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" ) ;
                    String cadena = results.get(i).toString( ) ;
                    
                    cadena = cadena.replace("[", "") ;
                    cadena = cadena.replace("]", "") ;
                    System.out.println( cadena ) ;
                    String[] sp = cadena.split(",") ;
                    
                    String habitacion = ( Integer.parseInt( sp[ 9 ].trim( ) ) == 2 ) ? "Doble" : "Sencilla",
                            fondeo = ( Integer.parseInt( sp[ 10 ].trim( ) ) == 2 ) ? "Regional" : "Local" ;
                    
                    java.util.Date fIni = sdf.parse( sp[ 11 ] ) ;
                    java.util.Date fFin = sdf.parse( sp[ 12 ] ) ;
                    String in = sdf.format( fIni ), fi = sdf.format( fFin ),
                            inversion = sp[ 18 ].trim( ) ;
                    float inver = Float.parseFloat( inversion ) ;
                    
                    r.setCampaign( Integer.parseInt( sp[ 0 ] .trim( ) ) ) ;
                    r.setPais( sp[ 1 ].trim( ) ) ;
                    r.setCuenta( sp[ 2 ].trim( ) ) ;
                    r.setTipoCampania( sp[ 3 ].trim( ) ) ;
                    r.setCampania( sp[ 4 ].trim( ) ) ;
                    r.setProducto( sp[ 5 ].trim( ) ) ;
                    r.setTipoProducto( sp[ 6 ].trim( ) ) ;
                    r.setAsset(sp[ 7 ].trim( ) ) ;
                    r.setPaquetes( Integer.parseInt( sp[ 8 ].trim( ) ) ) ;
                    r.setHabitacion( habitacion ) ;
                    r.setFondeado( fondeo ) ;
                    r.setIni( in ) ;
                    r.setFin( fi ) ;
                    r.setCveAsset( Integer.parseInt( sp[ 13 ].trim( ) ) ) ;
                    r.setRoi( new java.math.BigDecimal( sp[ 14 ].trim( ) ) ) ;
                    r.setGdv( new java.math.BigDecimal( sp[ 15 ].trim( ) ) ) ;
                    r.setTarjetas( 0 ) ;
                    r.setRevenue( new java.math.BigDecimal( sp[ 16 ].trim( ) ) ) ;
                    r.setResultado( new java.math.BigDecimal( sp[ 17 ].trim( ) ) ) ;
                    r.setpLaverage( 0 ) ;
                    r.setInversion( inver ) ;
                    r.setRoiT( BigDecimal.ZERO ) ;
                    r.setGdvT( BigDecimal.ZERO ) ;
                    r.setTarjetasT( 0 ) ;
                    r.setRevenueT( BigDecimal.ZERO ) ;
                    r.setResultadoT( BigDecimal.ZERO ) ;
                    r.setpLavT( 0 ) ;

                    res.add( r ) ;         
                }            

            et.commit( ) ;
            closeEntityManager( ) ;
            return res ;
                
            }catch ( Exception e ) {
                e.printStackTrace( ) ;
                closeEntityManager( ) ;
            }            
            closeEntityManager( ) ;
            return null ;
        }
        
	public static void ping( int method )
	{
            try {
                init( ) ;
                } catch (MasterCardException ex) {
                    Logger.getLogger(MasterCardDAO.class.getName()).log(Level.SEVERE, null, ex);
                  }
            
		// sincroniza
		synchronized ( em )
		{
			// en caso de que sea null
			if( em == null )
			{
				EntityManagerFactory emf = Persistence.createEntityManagerFactory( "MasterCardJPA" ) ;
				
				try
				{
					em.close( ) ;
				}catch( Exception e )
				{
					e.printStackTrace( ) ;
				}
				
				em = emf.createEntityManager( ) ;
			}
			// en caso de que no este en null
			// en caso d que no este abierta la conexion
			else if( ! em.isOpen( ) )
			{
				EntityManagerFactory emf = Persistence.createEntityManagerFactory( "MasterCardJPA" ) ;
				
				try
				{
					// lo intenta cerrar
					em.close( ) ;
				}catch( Exception e )
				{
					e.printStackTrace( ) ;
				}
				
				em = null ;
				
				// intenta volver a abrir
				em = emf.createEntityManager( ) ;
			}
			// en ocasiones puede marcar que si esta abierto el em pero no esta abierta la conexion a la base de datos
			else
			{
				Timestamp now = new Timestamp( System.currentTimeMillis( ) ) ;
				
				try
				{
					EntityTransaction et = em.getTransaction( ) ;
					
					boolean isActive = et.isActive( ) ;
					if( ! isActive )
						et.begin( ) ;
					
					// realiza un ping
					TblPing ping = new TblPing( ) ;
					ping.setContent( "" + method ) ;
					ping.setFechaAlta( now ) ;
					ping.setTipo( ( byte ) 1 ) ;
					
					em.persist( ping ) ;
					em.flush( ) ;
					
					if( ! isActive )
						et.commit( ) ;
				}catch( Exception e )
				{
					// en caso de que suceda una excepcion va a ser de tipo desconexion, o de tipo que la transaccion ya esta abierta
					// en caso de que la transaccion este ya abierta
					String messages = e.getMessage( ) ;
					if( messages.indexOf( "Transaction is currently active" ) != -1 )
					{
						// realiza un ping normal
						TblPing ping = new TblPing( ) ;
						ping.setContent( "" + method ) ;
						ping.setFechaAlta( now ) ;
						ping.setTipo( ( byte ) 1 ) ;
						
						em.persist( ping ) ;
						em.flush( ) ;
					}
					// en caso de que sea desconexion
					else
					{
						// realiza la reconexion
						EntityManagerFactory emf = Persistence.createEntityManagerFactory( "MasterCardJPA" ) ;
						
						try
						{
							// lo intenta cerrar
							em.close( ) ;
						}catch( Exception e1 )
						{
							e.printStackTrace( ) ;
						}
						
						em = null ;
						
						// intenta volver a abrir
						em = emf.createEntityManager( ) ;
						
						// realiza nuevamente un ping
						// realiza un ping
	 					TblPing ping = new TblPing( ) ;
						ping.setContent( "Ping Error: " + e.getMessage( ) ) ;
						ping.setFechaAlta( now ) ;
						ping.setTipo( ( byte ) 2 ) ;
						
						em.persist( ping ) ;
						em.flush( ) ;
					}
					
					// queda listo
				}
				
			}
		}// quita la sincronizacion
	}
}